PDA

Visualizza la versione completa : [C] Accedere a elementi di struct annidate


buji
03-07-2007, 23:31
Buonasera,
ho 3 struct che contengono una serie di dati e un puntatore.
Quindi, esemplificando:

struct1
dati

struct2
dati
puntatore a struct1

struct3
dati
puntatore a struct2

Ora, io ho un elemento di struct3 e devo accedere ad un dato della struct1.
Come ci arrivo?
Spero di essere stato chiaro..
Grazie mille

oregon
03-07-2007, 23:35
struct3.puntatore a struct2->puntatore a struct1->dati

oppure

puntatore a struct3->puntatore a struct2->puntatore a struct1->dati

buji
03-07-2007, 23:56
Grazie,
avevo già provato la seconda soluzione che mi hai proposto ma arrivato al secondo puntatore mi dice che non fa parte della struct (forse sbaglio operatori)..

oregon
04-07-2007, 00:04
Mostra le dichiarazioni effettive delle strutture ... insomma mostra il codice ...

buji
04-07-2007, 09:36
typedef struct _v {
int codice;
} volo;

struct albero {
volo *anodo;
struct albero *right, *left;
};
typedef struct albero *nodo_albero;

struct lista {
nodo_albero *ptr_nodo;
struct lista *next;
};
typedef struct lista *lista_elem;


Da un lista_elem devo accedere a un codice volo..
Grazie

oregon
04-07-2007, 09:50
Se hai

lista_elem r;

allora accedi con

r->ptr_nodo->anodo->codice;

ma devi correggere la struct lista in questo modo

struct lista {
nodo_albero ptr_nodo;
struct lista *next;
};

perche' nodo_albero e' gia' un tipo puntatore

ilmo lesto
04-07-2007, 10:37
Originariamente inviato da oregon

ma devi correggere la struct lista in questo modo

struct lista {
nodo_albero ptr_nodo;
struct lista *next;
};

perche' nodo_albero e' gia' un tipo puntatore

infatti, i typedef sono tanto comodi quanto fuorvianti, se non si presta attenzione è facile incappare in errori di questo tipo. anche a me capitano in continuazione disattenzioni di questo genere dettate dalla fretta...

XWolverineX
04-07-2007, 10:44
Originariamente inviato da ilmo lesto
infatti, i typedef sono tanto comodi quanto fuorvianti, se non si presta attenzione è facile incappare in errori di questo tipo. anche a me capitano in continuazione disattenzioni di questo genere dettate dalla fretta...


Sono fuorvianti se non vengono usati nel modo giusto.
Basta mettere il prefisso LP e non ci si imbroglia mai

LPINT a; //int *a
LPALBERO b; //albero* b;

oregon
04-07-2007, 10:54
Originariamente inviato da XWolverineX
Sono fuorvianti se non vengono usati nel modo giusto.

In effetti, suggerirei questo codice



typedef struct _volo {
int codice;
} *PVOLO;

typedef struct _nodo_albero {
PVOLO pnodo;
struct _nodo_albero *pleft;
struct _nodo_albero *pright;
} *PNODO_ALBERO;

typedef struct _lista {
PNODO_ALBERO pnodoalbero;
struct _lista *pnext;
} *PLISTA;


e nel main



PLISTA p;

//...

p->pnodoalbero->pnodo->codice;

buji
04-07-2007, 12:25
Grazie mille!!
Sicuramente avrò ancora bisogno del vostro aiuto.

Loading