PDA

Visualizza la versione completa : [C] Strutture e dubbi su abbreviazioni


Linusss
20-03-2006, 17:07
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:

oregon
20-03-2006, 17:18
Originariamente inviato da Linusss
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?


Sbagliato ...

Non hai definito un nuovo tipo, quello lo fai con la typedef.

Disponi di una struttura dati con cui poter dichiarare delle variabili. Ovvero puoi scrivere

struct data var;


Originariamente inviato da Linusss
e se scrivo:
data x;
x sarà una variabile di tipo data come da me definita, ho capito bene?

No ... anche questo e' sbagliato.

Se non utilizzi la typedef per definire un nuovo tipo di dato (la tua struttura), non la puoi utilizzare per dichiarare una variabile ... quindi non puoi scrivere

data var;

ma, come ti ho detto prima,

struct data var;


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

Ottengo lo stesso risultato?

Questa non e' una abbreviazione. Con la typedef hai effettuato la dichiarazione di un altro tipo di dato, che chiami x e che e' la tua struct data. A questo punto esiste un nuovo tipo di dato con cui puoi dichiarare una variabile, ad esempio

x var;

tale variabile sara' di tipo struct data


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


Come quella precedente tranne che il nuovo tipo di dato si chiama data (e non x) e la struttura e' "anonima" (e' possibile dato che la definisci e usi come tipo) ... Adesso puoi dichiarare una variabile con

data var;

Linusss
20-03-2006, 17:29
Grazie,chiarissimo.
Togliendo il typedef invece cosa succede?
struct data {
int valore;
char nome[];
}var;

Se ho capito bene..e spero di si...in questo caso è come se scrivessi data var dopo che ho definito la struttura?

Linusss
20-03-2006, 17:33
Ultima cosa, utilizzando il typedef, quindi se ho:
typedef struct data {
int valore;
char nome[];
}nuovotipo;

equivale a

typedef struct {
int valore;
char nome[];
}nuovotipo;

Ma quando è necessaria la prima e quando no?Cioè io posso anche omettere la parola in grassetto o a volte mi è necessaria? se si quando?

pablo1986
20-03-2006, 17:35
Originariamente inviato da Linusss
Grazie,chiarissimo.
Togliendo il typedef invece cosa succede?
struct data {
int valore;
char nome[];
}var;

Se ho capito bene..e spero di si...in questo caso è come se scrivessi data var dopo che ho definito la struttura?


sperando di non sbagliare, credo di si.(adesso come adesso non ne sono convintissimo)
è che in c si usa typedef per evitare di scrivere sempre "struct qualsiasivariabile" quando dichiari una struttura di tipo "qualsiasivariabile" nuova mentre in c++ mi sembra che puoi direttamente scrivere "qualsiasivariabile x" omettendo la parola chiave "struct" e quindi facendo a meno di "typedef"
ma ripeto:non ne sono sicurissimo correggetemi se sbaglio

oregon
20-03-2006, 17:35
Originariamente inviato da Linusss
Grazie,chiarissimo.
Togliendo il typedef invece cosa succede?
struct data {
int valore;
char nome[];
}var;

Se ho capito bene..e spero di si...in questo caso è come se scrivessi data var dopo che ho definito la struttura?

No ... se dici che e' come se scrivessi

data var;

intendi che esiste un tipo di dato data ... ma non esiste perche' non c'e' la typedef.

In questo caso e' come se scrivessi separatamente

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

struct data var;

Linusss
20-03-2006, 17:37
Originariamente inviato da oregon
No ... se dici che e' come se scrivessi

data var;

intendi che esiste un tipo di dato data ... ma non esiste perche' non c'e' la typedef.

In questo caso e' come se scrivessi separatamente

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

struct data var;

Sisi scusa intendevo struct data var;

e mi quoto in caso ti sia sfuggita quest'ultima domanda che per me è molto importante!

Ultima cosa, utilizzando il typedef, quindi se ho:
typedef struct data {
int valore;
char nome[];
}nuovotipo;

equivale a

typedef struct {
int valore;
char nome[];
}nuovotipo;

Ma quando è necessaria la prima e quando no?Cioè io posso anche omettere la parola in grassetto o a volte mi è necessaria? se si quando?
Grazie ancora.

oregon
20-03-2006, 17:51
Originariamente inviato da Linusss
Sisi scusa intendevo struct data var;

e mi quoto in caso ti sia sfuggita quest'ultima domanda che per me è molto importante!

Grazie ancora.

Puoi usare le due forme indifferentemente tenendo pero' presente un particolare ...

Se usi la forma "anonima" per la struttura, dovrai utilizzare sempre e comunque il nuovo tipo di dato per la futura dichiarazione delle tue variabili, ovvero

nuovotipo var;

Nell'altro caso potrai usare tutti e due i metodi, ovvero

nuovotipo var1;
struct data var2;

P.S. Non so se e' una svista ma nella dichiarazione della struttura che hai mostrato fino ad ora, l'elemento

char nome[];

non puo' essere dichiarato con lunghezza 0 ...

Linusss
20-03-2006, 18:00
Ma il dubbio mi è sorto perchè sto studiando le liste, le quali usano strutture definite completamente, cioè senza omettere l'etichetta, c'è un motivo valido?
Tra le dispense del professore è anche scritto che per la prima volta l'etichetta è indispensabile...ma non ne capisco il motivo.
Cioè se è così e basta la prendo per buona e va bene...ma mi piacerebbe capire.

oregon
20-03-2006, 18:15
Fornendo un nome alle strutture il codice diventa piu' "chiaro" ma non e' affatto necessario fornire il nome alle strutture ... non so con precisione cosa ti ha detto il professore ma puoi utilizzare una struttura senza nome per una typedef tranquillamente.

Loading