PDA

View Full Version : [C] Problema con le strutture


MEMon
20-03-2006, 15:08
Ciao a tutti, vi chiedo di chiarirmi una cosa che per voi sarà sicuramente banale!
Allora quando io definisco una struttura, per esempio:
typedef struct data {
int valore;
char nome[];
}

dopo io ho un nuovo tipo che si chiama data giusto?
e se scrivo:
data x;
x sarà una variabile di tipo data come da me definita, ho capito bene?

Ora, ho visto che a volte viene abbrievieta in questo modo:
typedef struct data {
int valore;
char nome[];
}x;

Ottengo lo stesso risultato?

Poi infine, se scrivo:
typedef struct {
int valore;
char nome[];
}data;
cosa ottengo?Ho notato anche che viene usaata quest'ultima notazione a volte...

grazie :confused:

ilsensine
20-03-2006, 15:19
Ciao a tutti, vi chiedo di chiarirmi una cosa che per voi sarà sicuramente banale!
Allora quando io definisco una struttura, per esempio:
typedef struct data {
int valore;
char nome[];
}

dopo io ho un nuovo tipo che si chiama data giusto?
No. Quella dichiarazione dichiara solo la "struct data". Nessun typedef è definito, in quanto manca il nome da assegnare al typedef.

e se scrivo:
data x;
x sarà una variabile di tipo data come da me definita, ho capito bene?
Se la dichiarazione è quella che hai indicato, questa istanza di x dovrebbe generare un errore in compilazione. E' corretto scrivere qui
struct data x;

Ora, ho visto che a volte viene abbrievieta in questo modo:
typedef struct data {
int valore;
char nome[];
}x;
Non è una abbreviazione, è il modo corretto di creare un typedef. Qui ora puoi accedere ai tipi
struct data
e "x" (che è un typedef del precedente). Puoi scrivere ovvero indifferentemente
struct data myvar;
oppure
x myvar;

Poi infine, se scrivo:
typedef struct {
int valore;
char nome[];
}data;
cosa ottengo?
Lo stesso del caso precedente; solo che la struct è ora "anonima". "data" qui è il typedef.

MEMon
20-03-2006, 15:23
Grazie sei stato velocissimo.
Allora il metodo corretto è questo se ho capito bene, la parola che ho messo in grassetto si chiama etichetta della struttura giusto? e non sempre sembra essere necessaria, allora ti chiedo, quando la devo mettere e quando no?

typedef struct data {
int valore;
char nome[];
}x;

ilsensine
20-03-2006, 15:30
Grazie sei stato velocissimo.
Allora il metodo corretto è questo se ho capito bene, la parola che ho messo in grassetto si chiama etichetta della struttura giusto? e non sempre sembra essere necessaria, allora ti chiedo, quando la devo mettere e quando no?

typedef struct data {
int valore;
char nome[];
}x;
A tua discrezione. Nota che puoi anche scrivere, come fanno alcuni,
typedef struct data {
int valore;
char nome[];
} data;

MEMon
20-03-2006, 15:35
Ma ti spiego, sto studiando le liste, e vengono utilizzate le strutture tutte definite senza omettere l'etichetta, c'è un motivo?

ilsensine
20-03-2006, 15:40
Ah sì; le liste sono forse l'unico caso dove è obbligatorio utilizzare una struttura non anonima. Questo perché non puoi usare il tipo definito nel typedef durante...la sua dichiarazione.

Questo ad esempio è legale:

typedef struct data {
int x;
struct data *prev, *next;
} data;


Anche questo è legale:

struct data {
int x;
struct data *prev, *next;
};


Questo _non_ è legale:

typedef struct {
int x;
data *prev, *next;
} data;


e neanche questo è legale:

typedef struct data {
int x;
data *prev, *next;
} data;

MEMon
20-03-2006, 16:02
Capito! grazie mi sei stato di grande aiuto! :p

deep_inside
20-03-2006, 20:31
mmmm... anche io sto studiando le le liste (ora gli alberi in realtà)...