Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405

    [C]Strutture

    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466

    Re: [C]Strutture

    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;

  3. #3
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    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?

  4. #4
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    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?

  5. #5
    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

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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;

  7. #7
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    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.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...

  9. #9
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    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.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.