View Full Version : [C] Leggere File Strutturati
leadergl
04-01-2006, 16:50
raga c'è un modo facile ed abbastanza rapido per leggere delle informazioni da un file "strutturato"?
Nel senso che ho un file di questo tipo, più o meno:
<nomeCategoria> <nomeCategoriaPadre> >numeroProprietàSpecificheDellaCategoria> <Proprieta_1> …<Proprieta_N>
...
...
<nomeCategoria> <nomeCategoriaPadre> >numeroProprietàSpecificheDellaCategoria> <Proprieta_1> …<Proprieta_N>
e vorrei inserire i vari elementi in un array (ma volendo anche qualche altra cosa) poichè dopo con questi dati devo costruire un albero radicato.
mi date info su come leggere efficientemente da file una cosa del genere?
raga c'è un modo facile ed abbastanza rapido per leggere delle informazioni da un file "strutturato"?
Nel senso che ho un file di questo tipo, più o meno:
<nomeCategoria> <nomeCategoriaPadre> >numeroProprietàSpecificheDellaCategoria> <Proprieta_1> …<Proprieta_N>
...
...
<nomeCategoria> <nomeCategoriaPadre> >numeroProprietàSpecificheDellaCategoria> <Proprieta_1> …<Proprieta_N>
Ciao, la soluzione più semplice in questi casi è quella di leggere tutta la riga in un buffer (ad esempio con la funzione fgets) e poi "spezzare" i vari campi con la funzione strtok.
Se all'interno di ogni campo non devi avere lo spazio, puoi usare lo spazio come delimitatore per la strtok, altrimenti devi usare o un altro separatore oppure proprio un altro metodo per la separazione dei campi.
leadergl
04-01-2006, 17:35
ok...ma se non so quanto è lunga la mia riga?
può tanto essere 10 caratteri quanto 100.....come si fa?
c'è una funzione che legge in automatico l'intera riga?
ok...ma se non so quanto è lunga la mia riga?
può tanto essere 10 caratteri quanto 100.....come si fa?
c'è una funzione che legge in automatico l'intera riga?
Beh, in genere si fissa comunque un limite massimo alla lunghezza della linea, anche molto grande. La funzione fgets accetta un massimo di N caratteri specificati nel suo secondo parametro.
Si può fare ad esempio:
#define MAXBUFLEN 1024
...
char buffer[MAXBUFLEN];
...
while (fgets (buffer, MAXBUFLEN, f) != NULL)
{
...elabora riga...
}
Purtroppo in "C" non è facile fare come in altri linguaggi in cui puoi fare (ad esempio in Java):
String line = br.readLine ();
Si potrebbe fare anche in "C" una cosa del genere ma devi fare tu una gestione di una "stringa espandibile" e poi fare una apposita funzione di lettura da file. Questo, ovviamente, a meno di usare delle librerie apposite.
Gandalf_BD
04-01-2006, 21:13
...e poi "spezzare" i vari campi con la funzione strtok...
ma in che libreria si trova?? :confused:
mi sembra utilissima! dimmi che è standard e sarò un uomo felice! :D
maxithron
04-01-2006, 21:39
ma in che libreria si trova?? :confused:
mi sembra utilissima! dimmi che è standard e sarò un uomo felice! :D
E' in <string.h>
è considerata `unsafe` per applicazioni multi-thread, dove è preferibile utilizzare la `strtok_r`
Gandalf_BD
04-01-2006, 21:45
...è considerata `unsafe` per applicazioni multi-thread, dove è preferibile utilizzare la `strtok_r`...
ha solo questa controindicazione???
cavolo... da oggi sono un uomo nuovo! :cool:
bella la strtok, adesso faccio qualche prova e forse avrò finto di cilare per cercare gli spazi.
:cincin:
bella la strtok, adesso faccio qualche prova e forse avrò finto di cilare per cercare gli spazi.
:cincin:
Beh ... comunque la strtok() non è "oro colato". Come già detto non è thread-safe (perché usa delle sue variabili globali) e a me personalmente non piace molto per il fatto che alla prima chiamata gli si passa (ovviamente) il puntatore alla stringa e nelle successive gli si passa NULL (altrimenti penserebbe che è un'altra nuova stringa!).
Prendiamo questo codice:
char string[] = ";aa;;bb;cc;", *p, *s;
s = string;
while ((p = strtok (s, ";")) != NULL)
{
printf ("[%s]\n", p);
s = NULL;
}
stampa, come è intuibile:
[aa]
[bb]
[cc]
Ecco una gestione (thread-safe) equivalente alla strtok che ho buttato giù:
typedef struct
{
char *ptr;
char *delim;
} GET_TOKEN;
void get_token_init (GET_TOKEN *gt, char *string, char *delim)
{
gt->ptr = string;
gt->delim = delim;
}
char *get_token_next (GET_TOKEN *gt, char *delim)
{
char *str;
if (delim == NULL)
delim = gt->delim;
while (*gt->ptr != '\0' && strchr (delim, *gt->ptr) != NULL)
gt->ptr++;
if (*gt->ptr == '\0')
return NULL;
str = gt->ptr;
while (*gt->ptr != '\0' && strchr (delim, *gt->ptr) == NULL)
gt->ptr++;
if (*gt->ptr != '\0')
{
*gt->ptr = '\0';
gt->ptr++;
}
return str;
}
/*-----------------------------*/
char string[] = ";aa;;bb;cc;", *p;
GET_TOKEN gt;
get_token_init (>, string, ";");
while ((p = get_token_next (>, NULL)) != NULL)
printf ("[%s]\n", p);l'output è uguale a quello sopra.
grazie, adesso provo...
cmq x il momento nn sto lavorando con stringhe, terrò presente x il futuro.
ciao
Gandalf_BD
05-01-2006, 14:22
Beh ... comunque la strtok() non è "oro colato". Come già detto non è thread-safe (perché usa delle sue variabili globali)...
beh... ma mi pare di aver capito che la strtok_r risolve tutti i problemi, no? :wtf:
beh... ma mi pare di aver capito che la strtok_r risolve tutti i problemi, no? :wtf:
Beh ... non proprio!
Innanzitutto strtok_r è disponibile solo su Linux. Su Windows (almeno sul VC++) non esiste ma esiste solo la strtok, che però è (fortunatamente) thread-safe.
Ma lasciamo perdere un momento la questione del thread-safe o non thread-safe. Il problema principale della strtok è che usa delle sue variabili globali e questo impedisce il suo utilizzo in modo "parallelo" anche all'interno dello stesso thread!
Esempio di codice:
#include <stdio.h>
#include <string.h>
void print_subtokens (char *str)
{
char *p, *s;
s = str;
/* !!!!!!!! BANG, CREA CASINI !!!!!!!! */
while ((p = strtok (s, "-")) != NULL)
{
printf ("[%s]\n", p);
s = NULL;
}
}
int main ()
{
char string[] = ";a-a;;b-b;c-c;", *p, *s;
s = string;
while ((p = strtok (s, ";")) != NULL)
{
print_subtokens (p);
s = NULL;
}
return 0;
}
Hai capito cosa succede? Sei stai usando la strtok (in un loop come sopra) e nel frattempo richiami una qualunque altra funzione che usa a sua volta la strtok .... bang!!! Ti pianta dei casini proprio perché la strtok usa quelle sue variabili globali. L'output di questo codice non è sicuramente quello che ci si aspetterebbe!
Con le funzioni get_token_xxx che ho buttato giù io, questo non succederebbe, perché lo stato della funzione è memorizzato in una struttura GET_TOKEN e ne puoi avere quante ne vuoi!
Fenomeno85
05-01-2006, 16:42
scusate ma o ho capito male il problema o non capisco proprio l'utilizzo di strtok ... se lui sa com'è la struttura
quindi
struct ciao_mamma {
char nome_categoria [n];
char nome_categoria_padre[n];
int num;
...
};
basta che usi un fread e sei a posto
~§~ Sempre E Solo Lei ~§~
scusate ma o ho capito male il problema o non capisco proprio l'utilizzo di strtok ... se lui sa com'è la struttura
quindi
struct ciao_mamma {
char nome_categoria [n];
char nome_categoria_padre[n];
int num;
...
};
basta che usi un fread e sei a posto
Dal post iniziale di leadergl io, sinceramente, ho capito che lui ha un file di testo con N campi su ogni riga. In questo caso la fread è inutile.
Gandalf_BD
05-01-2006, 20:46
Hai capito cosa succede? Sei stai usando la strtok (in un loop come sopra) e nel frattempo richiami una qualunque altra funzione che usa a sua volta la strtok .... bang!!! Ti pianta dei casini proprio perché la strtok usa quelle sue variabili globali. L'output di questo codice non è sicuramente quello che ci si aspetterebbe!
penso di aver capito...
... però se nella tua funzione print_subtokens() avessi usato due char con nomi diversi da quelli del main(), si sarebbe presentato lo stesso problema?
se si... non ho capito :D :D :D
se no... grazie mille per tutte le delucidazioni! :)
penso di aver capito...
... però se nella tua funzione print_subtokens() avessi usato due char con nomi diversi da quelli del main(), si sarebbe presentato lo stesso problema?
Si, certamente!! I nomi delle variabili non centrano niente. Le variabili p ed s, pur avendo lo stesso nome nelle due funzioni, sono variabili locali di ognuna funzione ed hanno indirizzi diversi.
Il problema. purtroppo, è interno alla strtok. La prima volta che chiami la strtok, gli passi nel primo parametro il puntatore all'inizio della stringa da esaminare. Nelle successive chiamate alla strtok, passi un NULL nel primo parametro e la strtok continua ad operare sulla stessa stringa perché si è tenuta "da qualche parte" delle informazioni sulla stringa, in pratica si "ricorda", per dirlo in modo semplice, dove è arrivata. Ma questa informazione è globale, quindi ce n'è soltanto una (per il singolo thread).
Gandalf_BD
05-01-2006, 22:36
Si, certamente!! I nomi delle variabili non centrano niente. Le variabili p ed s, pur avendo lo stesso nome nelle due funzioni, sono variabili locali di ognuna funzione ed hanno indirizzi diversi.
Il problema. purtroppo, è interno alla strtok. La prima volta che chiami la strtok, gli passi nel primo parametro il puntatore all'inizio della stringa da esaminare. Nelle successive chiamate alla strtok, passi un NULL nel primo parametro e la strtok continua ad operare sulla stessa stringa perché si è tenuta "da qualche parte" delle informazioni sulla stringa, in pratica si "ricorda", per dirlo in modo semplice, dove è arrivata. Ma questa informazione è globale, quindi ce n'è soltanto una (per il singolo thread).
ok... ora ho capito!
grazie :winner: :mano: :cincin: :ubriachi:
leadergl
06-01-2006, 11:07
Raga vi spiego bene il mio problema...devo scrivere un programma che sia in grado di generare un albero di tassonomia...mi spiego meglio, anzi vi do proprio il testo del mio esercizio così ci capiamo perfettamene!
Il mio problema è che devo fare questo esercizio in C e conosco ancora molto poco questo linguaggio quindi sto incontrando difficoltà....ed una di queste è la lettura da file...
Dovrei fare una prima bozza entro l'8 di questo mese (ed ho scoperto solo l'altro giorno di sto esercizio da fare...) quindi chiedo il vostro immenso aiuto con dei suggerimenti, su come proseguire...
Io avevo pensato ad un "Alberto Radicato" per contenere l'albero della tassonomia (di qui avete un immagine nel file allegato) e questo albero avrà una struttura del tipo:
--------------------------
| PADRE |
--------------------------
| FIGLIO | FRATELLO |
--------------------------
Dove figlio e fratello sono due puntatori ad una struttura dello stesso tipo...
Struttura AlberoRadicato
Padre (stringa)
Figlio (puntatore a "Struttura AlberoRadicato")
Fratello (puntatore a "Struttura AlberoRadicato")
Fine Struttura
Ecco un'immagine:
http://www.leadergl.net/immagini/AlberiRadicati.jpg
credo che sia la struttura ad albero migliore per rappresentare il mio problema in quanto non pone limiti iniziali sul numero dei vari sotto-nodi, ovviamente per indicare che non ci sono più fratelli di un determinato nodo basta usare un carattere speciale identificato come terminatore...
che ne pensate? è ok?
Raga vi spiego bene il mio problema...devo scrivere un programma che sia in grado di generare un albero di tassonomia...mi spiego meglio, anzi vi do proprio il testo del mio esercizio così ci capiamo perfettamene!
Ciao, ho appena letto il documento allegato. Interessante! (almeno per me che non ho mai fatto/studiato queste cose ;) ).
Voglio iniziare anche io a scrivere del codice per 'sta cosa, giusto per cultura personale! :)
Partiamo dal file che deve contenere questa Tassonomia. L'idea (come anche spiegato nel documento) di mettere in ogni riga:
<nomeCategoria> <nomeCategoriaPadre> <numeroProprietàSpecificheDellaCategoria> <Proprieta_1> … <Proprieta_N>
non mi sembra molto valida. Il problema (un difetto più che altro) è che avresti, ad esempio, il nome della categoria padre ripetuto più volte per ogni figlio.
La struttura della Tassonomia è sostanzialmente una struttura ad albero. In questi casi un bel file XML sarebbe l'ottimale ma forse sarebbe troppo complessa la sua gestione (dovresti usare un parser "C" per file XML, come la libxml, per esempio).
Una cosa un po' più "leggera" rispetto ad XML per strutturare una gerarchia di elementi potrebbe essere (è una ipotesi) un file di testo organizzato così:
[Veicoli da trasporto]
{
@proprietà1
@proprietà2
[Per Mare]
{
@proprietà1
@proprietà2
}
[Per Terra]
{
@proprietà1
[Su Rotaia]
{
@proprietà1
}
[Su Ruota]
{
@proprietà1
}
}
[Per Aria]
{
@proprietà1
}
}
Cosa ne pensi?
leadergl
06-01-2006, 13:23
Una cosa un po' più "leggera" rispetto ad XML per strutturare una gerarchia di elementi potrebbe essere (è una ipotesi) un file di testo organizzato così:
[Veicoli da trasporto]
{
@proprietà1=...
@proprietà2=...
[Per Mare]
{
@proprietà1=...
@proprietà2=...
}
[Per Terra]
{
@proprietà1=...
[Su Rotaia]
{
@proprietà1=...
}
[Su Ruota]
{
@proprietà1=...
}
}
[Per Aria]
{
@proprietà1=...
}
}
Cosa ne pensi?
Mi piace questa struttura, è interessante ed utile anche perchè come scritto nel documento devo puntare ad occupare meno spazio possibile col file...l'unico fatto è che mi diventa contorto leggerlo col C rispetto al modello precedente, ripeto che non sono molto pratico di C avendo sempre fatto TurboPascal e VisualBasic....
cmq mi piace l'idea...ma mi servirebbero info su come analizzare la struttura di questo file tramite il C
P.S. mi fa piacere che ti stai interessando, anche a me il tipo di esercizio piace abbastanza, è intrigante...ricordo che devo dare una bozza entro l'8 di questo mese e l'esercizio completo entro il 15 ;) in ogni caso grazie mille...io sarò collegato 24H su 24H (beh tranne stanotte che dormo :D)
Guarda ... dal mio punto di vista (non so dal tuo), leggere ed interpretare un file come quello che ho postato, è relativamente semplice ed è comunque il problema "minore".
La cosa a cui prestare maggiore attenzione, secondo me, è come gestire "in memoria" tutta la struttura della Tassonomia. Bisogna quindi utilizzare delle strutture dati apposite che facciano da "contenitori" per i dati della Tassonomia.
Volendolo fare in "C" e senza utilizzare librerie esterne, direi che bisogna pensare a come realizzare una struttura ad albero facilmente gestibile ed espandibile. Putroppo il "C" non ha di base delle funzioni e/o librerie standard per la gestione dei "contenitori" (siano essi Liste, Code, Hashtable, ecc....) come in altri linguaggi (vedi Java). E a meno di usare appunto librerie esterne, sono da costruire "a mano".
Vediamo il problema nel dettaglio. Intanto devo dire che mi ero sbagliato sulle proprietà: pensavo che dovessero avere un valore (avevo messo @proprietà=...) ma rileggendo il documento ho capito che non è così ed ho già corretto il mio post.
Ogni nodo della Tassonomia è composto da:
- Il nome della categoria.
- Un numero N di proprietà.
- Un numero M di sottocategorie.
Per le proprietà e le sottocategorie si può usare una semplice lista linkata, se non ci sono altre esigenze specifiche (es. cercare velocemente una proprietà o una sottocategoria).
Adesso ci penso.
leadergl
06-01-2006, 14:41
riguardo la struttura da utilizzare per memorizzare al meglio i dati credo di aver già postato la soluzione migliore per questo caso.
ad ogni modo devo usare una struttura ad albero, e credo che l'esempio fornito sia ad ok in quanto prevede che i nodi dello stesso livello (fratelli) siano trattati come una lista linkata in modo da non avere limitazioni sul numero e da poter variare il numero degli elementi ad ogni livello dell'alberto, uguale per quanto riguarda invece il "sotto-albero" di ogni nodo che va trattato allo stesso modo...
Ok, partiamo dalle proprietà, che è una parte abbastanza semplice. La struttura dati per le proprietà io l'ho pensata così:
/*-------- Proprieta` --------*/
#define LEN_NOME_PROPRIETA 40 /* Lunghezza che si vuole */
typedef struct tassonomia_dati_prop
{
char nome[LEN_NOME_PROPRIETA+1];
} TASSONOMIA_DATI_PROP;
typedef struct tassonomia_nodo_prop
{
TASSONOMIA_DATI_PROP datiprop;
struct tassonomia_nodo_prop *prev;
struct tassonomia_nodo_prop *next;
} TASSONOMIA_NODO_PROP;
typedef struct tassonomia_list_prop
{
TASSONOMIA_NODO_PROP *head;
TASSONOMIA_NODO_PROP *tail;
} TASSONOMIA_LIST_PROP;
Ovviamente una TASSONOMIA_LIST_PROP (una lista di proprietà) farà poi parte di ogni categoria e quindi di ogni nodo della Tassonomia. A questo punto ci sarebbe da scrivere (come minimo) le funzioni per a) inizializzare la lista, b) inserire una proprietà, c) liberare (free) la lista e se si vuole, d) enumerare le proprietà.
Nota, ho pensato di usare le liste double-linked perché le trovo sempre le più comode e veloci da gestire. Cosa ne pensi?
leadergl
06-01-2006, 16:02
la parte che non capisco è questa:
typedef struct tassonomia_list_prop
{
TASSONOMIA_NODO_PROP *head;
TASSONOMIA_NODO_PROP *tail;
} TASSONOMIA_LIST_PROP;
mentre questo:
/*-------- Proprieta` --------*/
#define LEN_NOME_PROPRIETA 40 /* Lunghezza che si vuole */
typedef struct tassonomia_dati_prop
{
char nome[LEN_NOME_PROPRIETA+1];
} TASSONOMIA_DATI_PROP;
typedef struct tassonomia_nodo_prop
{
TASSONOMIA_DATI_PROP datiprop;
struct tassonomia_nodo_prop *prev;
struct tassonomia_nodo_prop *next;
} TASSONOMIA_NODO_PROP;
è in pratica la struttura che avevo proposto prima più o meno...dove:
*prev = figlio
*next = fratello
non capisco bene che struttura verrebbe fuori inserendo l'altra parte, ti ricordo inoltre che anche l'esercizio parla di "Alberi Radicati"...
cmq spiega meglio l'idea della tua struttura...
=== AGGIUNTA ===
dalla tua struttura verrebbe fuori una lista di Alberi Radicati....giusto?
leadergl
06-01-2006, 16:07
la mia idea era una struttura di questo tipo:
#define LEN_NOME_PROPRIETA 40
struct Albero_Tassonomia
{
char[LEN_NOME_PROPRIETA+1] Valore_Nodo;
struct Albero_Tassonomia *figlio;
struct Albero_Tassonomia *fratello;
};
#define Albero struct Albero_Tassonomia
No no .... alt. Io ho voluto inziare dalle proprietà ma non ho ancora completato tutta la struttura della Tassonomia. Io in genere preferisco scrivere il codice in modo che sia molto modulare e le strutture dati molto "incapsulate".
Le strutture che ho fatto con il nome xxx_PROP sono solo esclusivamente per le proprietà, non c'è alcun figlio! È solo una lista di proprietà e basta.
Una variabile di tipo TASSONOMIA_LIST_PROP farà poi parte di un'altra struttura che costituirà una categoria. (calma che ci arrivo!)
#define Albero struct Albero_TassonomiaNon fare mai una cosa del genere! ;)
Semmai:
typedef struct Albero_Tassonomia Albero;
Questo in generale.
leadergl
06-01-2006, 16:34
Quello che non capisco è perchè creare una struttura dati così complicata quando quella che ci basta è un semplice albero non binario in cui ogni livello dei nodi può avere un numero variabile di nodi....e questa struttura è proprio quella di figura:
http://www.leadergl.net/immagini/AlberiRadicati.jpg
che non è altro che un generico albero che non impone alcuna limitazione sul numero di figli di ciascun nodo (compreso la radice)...
perchè vuoi usare quella struttura complicata? dov'è che stai cercando di arrivare? vorrei capire anche io...:( :D
========== AGGIUNTA ==========
quella figura altro non è che questo albero:
http://www.leadergl.net/immagini/AlberiRadicati2.jpg
Quello che non capisco è perchè creare una struttura dati così complicata quando quella che ci basta è un semplice albero non binario in cui ogni livello dei nodi può avere un numero variabile di nodi....e questa struttura è proprio quella di figura:
che non è altro che un generico albero che non impone alcuna limitazione sul numero di figli di ciascun nodo (compreso la radice)...
perchè vuoi usare quella struttura complicata? dov'è che stai cercando di arrivare? vorrei capire anche io...:( :D
L'immagine che hai riportato, è giustissima. Il classico albero gestito a liste linkate in cui ogni nodo ha N figli e M fratelli. Nel disegno, ogni rettangolo arrotondato rosso è una categoria ("Veicoli da trasporto", "Per Mare", ecc...) ma tieni presente che ognuno di essi dovrà avere anche una lista di proprietà!
leadergl
06-01-2006, 16:51
scusa la lista di proprietà non può tranquillamente essere definita da altri nodi dell'albero di livello maggiore?
come ad esempio il nodo centrale di livello 1 ha 4 figli che potrebbero tranquillamente essere 4 proprietà oppure 3 proprietà ed una ulteriore categoria che a sua volta avrà altri figli=proprieta e/o categorie....
che ne pensi?
leadergl
06-01-2006, 16:57
no, hai ragione, i nodi dell'albero (come dice il testo) devono contenere solo i nomi delle categorie; quindi le proprietà di ciascusa categoria vanno messe a parte e le possiamo benissimo rappresentare come una lista...
si ok, mi trovo con te....ma a questo punto potremmo semplicemente
aggiungere un campo alla struttura:
#define LEN_NOME_PROPRIETA 40
struct Lista_Proprieta
{
char[LEN_NOME_PROPRIETA+1] valore;
struct Lista_Proprieta *next;
};
typedef struct Albero_Tassonomia
{
char[LEN_NOME_PROPRIETA+1] Categoria;
struct Lista_Proprieta *proprieta
struct Albero_Tassonomia *figlio;
struct Albero_Tassonomia *fratello;
} ALBERO_TASSONOMIA;
visto che cmq ogni categoria avrà le sue proprietà...
che ne dici?
scusa la lista di proprietà non può tranquillamente essere definita da altri nodi dell'albero di livello maggiore?
come ad esempio il nodo centrale di livello 1 ha 4 figli che potrebbero tranquillamente essere 4 proprietà oppure 3 proprietà ed una ulteriore categoria che a sua volta avrà altri figli=proprieta e/o categorie....
che ne pensi?
Che così non ha molto senso. Primo, ti complichi la vita. Secondo, come la gestisci? Come differenzi tra categoria e proprietà? Ci metti una variabile che fa da tag? Sia la categoria che la proprietà hanno un nome (es. char nome[...]; ). E se volessi farli lunghi diversi? E se volessi aggiungere un campo ad ogni proprietà?
Insomma ... io cerco sempre di incapsulare il più possibile, anche se la cosa può risultare lunga o strana.
leadergl
06-01-2006, 17:18
:D ti sei perso un mio post, questo: http://www.hwupgrade.it/forum/showpost.php?p=10802365&postcount=30
Guarda <questo> (http://www.hwupgrade.it/forum/showpost.php?p=10442037&postcount=5) post che avevo fatto in un thread iniziato da -Ivan-.
Avevo postato una semplice gestione di una coda (queue) in "C".
Osserva le funzioni queue_insert() e queue_extract(). Hanno un parametro di tipo queue_data* e la struttura queue_data contiene solo ed unicamente il dato da gestire. Non contiene next, prev o qualunque altra cosa che non sia attinente al dato da gestire. In questo modo ho disaccoppiato il dato dalla gestione interna della coda.
Così, a chi usa le suddette funzioni, non gliene frega niente di sapere come è fatta la coda e che c'è un prev o un next nella coda!!
Per il momento ti devo salutare, ci risentiamo nei prossimi giorni. Adesso sto per uscire e stasera c'è la finale di ballo su Rai1 (e non la perdo!). ;)
leadergl
08-01-2006, 11:22
...up...
leadergl
12-01-2006, 08:57
ok, alla fine ho scelto questa come struttura file:
Veicoli da trasporto|3|proprieta1
Per Mare|0|proprieta1
Da Terra|2|proprieta1
Su Rotaia|0|proprieta1
Su Ruote|0|proprieta1
Per Aria|0|proprieta1
in pratica è:
Nome_Radice|numero_sottonodi|proprieta_1|...|proprieta_N
Nome_nodo|numero_sottonodi|proprieta_1|...|proprieta_N
...
Nome_nodo|numero_sottonodi|proprieta_1|...|proprieta_N
ovviamente se il <b>numero_sottonodi</b> di Nome_Radice o di Nome_Nodo è maggiore di ZERO allora successivamente verranno elencati i suoi sottonodi per poi proseguire normalmente.
Il tutto sarà opportunamente analizzato da una funzione ricorsiva....credo che così vada bene, che ne dite?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.