Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c] Librerie generiche

    Bon, di recente mi sto mettendo a sviluppare in modo serio (Con tutti i controlli del caso a prova di utente idiota e seguendo le linee guida) librerie che si adattano a diversi scopi. Principalmente, per mero esercizio, quelle relative alle diverse basi di dato o adt.

    Nonostante ritenga di aver fatto ottimi passi avanti da alcuni anni a quest parte, c'è ancora una cosa che non mi piace nelle librerie che sviluppo.
    Per quanto siano generiche e adattabili, dipendono comunque sempre da una seconda libreria che definisca un tipo item_t e relative funzioni di base per richiamarne i campi o altre procedure di servizio in merito.

    Ma se io volessi fare in modo che la libreria sia indipendente dai dati?
    PEr spiegarmi meglio... di recente ho creato una sorta di Hashmap che funzioni in modo simile all'hashmap del java e risponda a metodi simili
    però nel mio caso, ora come ora, la hashmap da me creata accetta solo oggetti da inserire di tipo item_t. Se un utente la volesse usare per inserire altri tipi di oggetti o, peggio, se in uno stesso programma ci fosse necessità di usarla per diversi tipi di oggetti, sarebbe problematico.

    Ricordo che quando feci, l'anno scorso, l'esame di algoritmi di programmazione avanzata, il professore ci fornì un implementazione di hashmap che funzionava in modo indifferente da quali oggetti vi andassero inseriti. Ricordo che il tutto fu creato tramite l'uso di puntatori a void (E credo sia un metodo molto utilizzato), ma non ci fu spiegato a fondo perché non faceva parte degli obiettivi del corso in questione.

    Qualcuno potrebbe gentilmente illuminarmi in merito o fornirmi qualche guida, anche in inglese ovviamente, che spieghi ciò a cui sono interessato?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [c] Librerie generiche

    Originariamente inviato da Celebron
    Ma se io volessi fare in modo che la libreria sia indipendente dai dati?
    Questo tipo item_t che hai definito cos'è? Se vuoi realizzare librerie generiche, in C, devi ricorrere ai puntatori void. Nulla di difficile, c'è un po' da lavorarci (soprattutto se vuoi realizzare certe cose...) ma si può fare. Se è questo il tuo problema, guide da suggerirti non ne ho perché in passato ho sviluppato anche io qualcosa del genere ma appresi le tecniche semplicemente leggendo altri sorgenti distribuiti qua e là per il mondo. Da qualche parte dovrei avere una libreria per la gestione di liste doppiamente concatenate che ho fatto tempo fa appunto rendendola generica, se vuoi posso mostrartela. Se poi non è questo il problema, spiega meglio.
    every day above ground is a good one

  3. #3
    Certo che lavorare con i template è un'altra cosa...
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da MItaly
    Certo che lavorare con i template è un'altra cosa...
    Però la magia di gestire un array di un tipo generico con un puntatore void non la vivrai mai i template
    every day above ground is a good one

  5. #5
    Originariamente inviato da YuYevon
    Però la magia di gestire un array di un tipo generico con un puntatore void non la vivrai mai i template
    In genere preferisco risparmiarmi anche la magia di piantare le viti con il martello invece che con il cacciavite.

    (e poi a gestire i tipi generici con i puntatori a void non proverai mai la magia di ottenere sette pagine di errori incomprensibili perché hai dimenticato un punto e virgola )
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Per implementare una libreria generica come già ti è stato detto devi lavorare con i puntatori a void, i cosiddetti HANDLE. Ma non basta. A questo si aggiunge che un buon e "vero" ADT generico fornisca un interfaccia di base che fornisca unicamente i prototipi resi disponibili dalla libreria stessa e possibilmente come commento la descrizione della funzione, basta.

    Come è implementata (.c) deve risultare completamente "nascosto" a chi la utilizza e ciò non riguarda unicamente il tipo di dato, che verrà appunto indicato come HANDLE, ma anche e soprattutto il tipo di struttura dati utilizzata. Per farti un esempio potresti decidere di voler implementare una coda a priorità tramite uno heap, fornirai allora un header contenente i prototipi per la gestione dello heap stesso, ma chi lo utilizza non deve sapere e non deve essere interessato se lo heap internamente verrà gestito tramite lista concatenata, array, etc...

    Essenzialmente vi sono 2 livelli di programmazione generica:
    1) Definire un header generico (HANDLE) ed incudere nel progetto l'implementazione specifica per il tipo di dato trattato.
    2) Definire un header generico e includere nel progetto l'implementazione di funzioni che lavorano a loro volta s tipi di dati generici, definendo sempre la struttura dati (qualora si voglia implementarla) non nell'header. Su quest'ultimo aspetto si possono fare anche alcuni miglioramenti, sempre nascosti all'utente, che incidono molto sul tipo di utilizzo della struttura dati e si basano essenzialmente sull'analisi di complessità delle prestazioni.


    Non conosco guide reperibili in internet, ma vi sono svariati libri sull'argomento che trattano le basi della programmazione generica in C tramite ADT.

    Se hai bisogno di qualche chiarimento chiedi pure, uiltimamente me ne sto occupando parecchio si queste cose, in ogni caso le basi da cui devi partire sono quelle dette. Ricordandoti che una funzione delle più semplici potresti utilizzare accetta come parametri la dimensione in bytes dell'oggetto su cui devi lavorare e il puntatore alla funzione di confronto (livello 2 base).



    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da MItaly
    In genere preferisco risparmiarmi anche la magia di piantare le viti con il martello invece che con il cacciavite.

    (e poi a gestire i tipi generici con i puntatori a void non proverai mai la magia di ottenere sette pagine di errori incomprensibili perché hai dimenticato un punto e virgola )
    Oddio è pur vero che il C++ spesso se ne esce con una sintassi che le viti ti costringe a piantarle direttamente a testate
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.