Newsgroup: it.comp.lang.c
Titolo: Stesse operazioni su liste diverse

Sto scrivendo un programma in cui impiego diverse liste.
Chiaramente molte operazioni sono le stesse e vorrei cercare di
impiegare per quanto possibile lo stesso codice. Dovrei utilizzare
procedure di confronto diverse su diversi campi delle strutture, per
la funzione di confronto posso ricorrere a puntatori a funzione, ma
per il differente nome dei record come faccio?
Potrei anche mettere tali record nella stessa posizione nelle diverse
liste, ma esiste un modo di riferirsi all'n-mo campo si una struttura
senza fare riferimento al nome?
Ringrazio fin da adesso quanti risponderanno.
   Ciao,
      Giovanni. 
Giovanni Neglia
gne...@ZZZtiscalinet.it
per rispondere rimuovere ZZZ dall'indirizzo

Scusa, ma se ogni lista ha una sua funzione di confronto, questa funzione lo
sa il nome del record no ?
Se il tuo problema non e' nel confronto non capisco comunque il problema hai
liste diverse su cui fai operazioni diverse quindi non puoi usare le stesse
funzioni e se le operazioni che fai sono le stesse vuol dire che i dati sono
compatibili e puoi usare lo stesso nome del campo.
Oltretutto tu usi il termine "record", ma credo che intendessi "campo"
oppure ti sei spiegato male (o io ho capito male).
Ciao
"Giovanni Neglia" <gne...@ZZZtiscalinet.it> wrote in message
news:399dad8f...@news.tiscalinet.it...


Forse ho capito quale e' il tuo problema.
devi inventarti un metodo per gestire contenitori
astratti, credo che il c++ preveda templates, ma non
te lo do per certo perche' non conosco C++.
Secondo me devi strutturare tutto in modo che le tue
funzioni appiano nel prototipo: 
inseriscinodoinlista(void * lista, size_t dim_dato_al_netto,
                     void * dato,
                     signed short int (* confronto)())
all' interno della struttura (o anche all' esterno) puoi definire
SOLO LA STRUTTURA DELL' INTESTAZIONE DEL NODO e non tutto compreso
il dato astratto che quindi sara' conosciuto solo da (*confronto)()
es struct intestaz_nodo 
    {
      void * precedente;
      void * successivo;
    }
quando allochi memoria per un nuovo elemento:
char punt_a_nuovo;
punt_a_nuovo = malloc(sizeof(intestaz_nodo) + dim_dato_netto )
per avere garanzia di contiguita' della struttura intestazione con 
i dati e poter usare memcopy().
ogno volta che vuoi referenziare i campi dell 'intestazione
vai di cast esplicito :
(* intestaz_nodo)punt_a_nuovo->precedente =
altrocastesplicito->altrocampo;
e per passare a confronto solo il dato netto da confrontare:
punt_a_nuovo + sizeof(intestaz_nodo)
ATTENZIONE!!! punt_a_nuovo non e' dichiarato puntatore a char per
caso, ma proprio per permettere questa aritmetica di puntatori.
Non so se hai chiesto proprio questo. Spero di averti risposto.
ciao
roberto.
Giovanni Neglia ha scritto:


per il differente nome dei record come faccio?
Hai provato a vedere come sono fatte le funzioni standard qsort e
bsearch ? accettano come funzione di confronto una funzione che
accetta dei puntatori void. In C qualsiasi puntatore, di qualunque
tipo, puo' essere "up-castato" a puntatore void.
Sara' poi compito della specifica funzione di confronto, compiere il
"down-casting" verso il tipo corretto ed eseguire la comparazione.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------