PDA

Visualizza la versione completa : [C] Definire ed utilizzare "strutture nidificate"


jacopos81
03-05-2007, 11:14
se io ho delle strutture di questo tipo:


struct NodoLista {
int prova;
void *value;
struct NodoLista *next;
};

typedef struct NodoLista *list

struct node {
char *name;
list figli;
int id;
};

typedef struct node *node;

struct attributo {
char *nome;
char *valore;
};
typedef struct attributo attributo;

e ho un nodo, che nel campo "figli" ha una lista di determinati oggetti. Questi oggetti nel campo void *value, hanno un elemento di tipo attributo.
La mia domanda è: come posso fare per accedere ai campi (nome e valore) dell'elemento di tipo attributo, vista la nidificazione di strutture?

cioe:

node n;
list l;

(creo una certa lista dove nel campo void ci sono elementi di tipo attributo e tramite una funzione la metto come campo "figli" nel nodo n)

ora come faccio se per es volessi cambiare il campo valore di un certo elemento attributo che è nella lista suddetta??

importante: io nella mia funzione ho a disposizione solo il nodo come paramentro e il nome del campo "nome" dell'oggetto attributo da cambiare

nodo->figli->value->valore ???

nodo->figli->valore ???

queste ovviamente sono illegali.. ma come posso fare??

grazie

oregon
03-05-2007, 11:34
Intanto, penso che la typedef

typedef struct attributo attributo;

che hai riportato, sia invece

typedef struct attributo *attributo;

Se e' cosi', puoi accedere con



node n;
attributo a;

a=(attributo)n->figli->value;
printf("%s\n", a->nome);


... ovviamente, per scorrere i vari nodi dovrai gestire il campo next della NodoLista ...

jacopos81
03-05-2007, 17:29
Originariamente inviato da oregon
Intanto, penso che la typedef

typedef struct attributo attributo;

che hai riportato, sia invece

typedef struct attributo *attributo;

Se e' cosi', puoi accedere con



node n;
attributo a;

a=(attributo)n->figli->value;
printf("%s\n", a->nome);


... ovviamente, per scorrere i vari nodi dovrai gestire il campo next della NodoLista ...

in questo modo però quando vado a stampare la stringa nome, non me la stampa in maniera corretta ma mi stampa un carattere scorretto..


attributo temp;
temp = (attributo)n->attributes->value;
printf(" s\n",temp->nome);



ps: ti ricordo che sono dentro ad una funzione, alla quale viene passato come paramentro un nodo n. E devo lavoare sulla lista di elementi di tipo attributo che appartiene appunto al nodo n.

jacopos81
03-05-2007, 18:30
ho fatto qualche prova.. ma mi rimane il problema che non riesco ad avere le giuste stringhe.

faccio un esempio:

node n;
attributo a;

a=(attributo)n->figli->value;
printf("%s\n", a->nome);


se per esempio dentro a n->figli->value (che è un elemento di tipo attributo), nel campo nome c'era "PIPPO",
anche in a->nome dovrei avere PIPPO, invece mi stampa uno o piu caratteri sballati..

cosa puo essere??

help!!!! :confused:

oregon
03-05-2007, 19:05
A questo punto devi mostrare tutto il codice, compreso quello dell'inserimento, perche' l'errore sara' da qualche altra parte ...

LiLyblack
04-05-2007, 18:42
Originariamente inviato da oregon


... ovviamente, per scorrere i vari nodi dovrai gestire il campo next della NodoLista ...

Chiedo in particolare a Jacopo: ma ha senso scorrere i nodi? Passando un determinato nodo in input (precisamente l'indirizzo di una struttura node) non ho già l'indirizzo e quindi evito di scorrere i nodi?

Un'altra cosa: un nodo può avere più attributi (coppia nome-valore), giusto? E quindi quello che devo fare inzialmente nella get_attribute è scorrere la lista di attributi del nodo e verificare che sia presente la chiave(nome) passata in input?

:master: :master: :cry:

jacopos81
04-05-2007, 18:47
Originariamente inviato da LiLyblack
Chiedo in particolare a Jacopo: ma ha senso scorrere i nodi? Passando un determinato nodo in input (precisamente l'indirizzo di una struttura node) non ho già l'indirizzo e quindi evito di scorrere i nodi?


non è che scorro i nodi ma scorro la lista attributes che è un campo del nodo..



Un'altra cosa: un nodo può avere più attributi (coppia nome-valore), giusto? E quindi quello che devo fare inzialmente nella get_attribute è scorrere la lista di attributi del nodo e verificare che sia presente la chiave(nome) passata in input?

si infatti..scorro lo la lista finche non trovo l'aatributo che ha per nome il paramentro passato nella funzione..


stai facendo anche tu questo progetto??

LiLyblack
04-05-2007, 18:49
:cry: <-- Questa emoticon dovrebbe essere auto-esplicativa. :D

jacopos81
04-05-2007, 19:00
siamo negli stessi panni allora..

miha dato meno problemi il primo modulo, per quanto fosse piu lungo come controlli e tutto il resto.. ma questo secondo me è molto piu incasinato.. con tutte le strutture nidificate e i file incrociati..

a che punto sei?? io come puoi leggere sopra ho problemi con le funzioni riguardanti gli attribute..

LiLyblack
04-05-2007, 19:06
Devo scrivere le due funzioni per la gestione degli attributi e trovare un modo efficiente per testare la add_child...!

Speriamo di finire in tempo!


:ciauz:

Loading