Typedef. Aiuto!!

di il
8 risposte

Typedef. Aiuto!!

Buongiorno a tutti.
Ho un problema. Non riesco a capire la funzione di typedef. Ho letto articoli su siti e i capitoli riguardanti strutture e la funzione citata, ma non riesco a capirla.
Quando faccio gli esercizi, non mi viene mai in mente di utilizzarla. Se voglio creare una struttura, la inizializzo prima del main():
struct nomestruttura{
...
...
...
..};
Poi dopo il main dichiaro:
struct nomestruttura nome1 nome2 nome3 nome4;
Dichiarando così quattro strutture.
Mi potete dire se ciò che faccio è giusto? Mi potreste anche spiegare come utilizzare typedef nella programmazione c?
Vi ringrazio anticipatamente

8 Risposte

  • Re: Typedef. Aiuto!!

    Ciao,
    il typedef serve per definire nuovi tipi di dato e la sintassi è
    typedef vecchio_tipo nuovo_tipo
    Quindi se io faccio ad esempio
    typedef int mio_int
    significa che posso usare il tipo "mio_int" come se fosse un int. E quindi ha senso scrivere
    mio_int num = 5;
    Il typedef è parecchio comodo con le strutture. Ad esempio abbiamo una struttura
    struct nome_struttura {
    ...
    ...
    };
    Ora possiamo definire un nuovo tipo
    typedef struct nome_struttura nome_nuovo
    ed utilizzarlo normalmente. Addirittura si può anche fare in un colpo solo:
    typedef struct nome_struttura {
    ...
    ...
    } nome_nuovo;
  • Re: Typedef. Aiuto!!

    OK. Ma la differenza tra utilizzare il typedef o definire una struttura prima del main qual'é?
    Poi perchè uno dovrebbe andare a definirne un nuovo tipo?
    Questa descrizione del typedef l'avevo già letta in qualche altro sito.
  • Re: Typedef. Aiuto!!

    Il vantaggio c'è ed è anche consistente!
    Guarda ad esempio questo codice:
    
    struct EL
    {
        int dato;
        struct EL *next;
    };
    
    typedef struct EL ElementoLista;
    typedef ElementoLista *List;
    
    
    /* funzione che stampa una lista */
    void stampa_lista(List l)
    {
        while(l != NULL)
        {
            printf("%d\n", l->dato);
            l = l->next;
        }
    }
    
    
    /* funzione che inserisce un elemento in coda alla lista */
    List ins_in_coda(List head, int elem)
    {
        ...
    }
    
    ...
    
    
    Ho definito due nuovi tipi di dato: ElementoLista, che rappresenta una struct EL, e soprattutto Lista, che rappresenta un puntatore ad un elemento, cioè un puntatore ad una struct.
    Poi, nel resto del codice, posso utilizzare semplicemente List, senza scrivere ogni volta "struct EL *". Diciamo che semplifica il codice e lo rende più leggibile.
  • Re: Typedef. Aiuto!!

    Però, io potrei fare la stessa cosa così:
    
    struct EL
    {int dato;
     char nome;
    }
    int main()
    struct EL Elementolista, Lista;
    /*dichiarando così due liste uguali a quella descritta sopra*/
    /*continuazione del programma*/
    ...
    ...
    ..
    
    Secondo te è giusto fare così?
    Sto dubbio mi sta perseguitando e a breve avrò un esame sul C, perciò vorrei capire bene bene tutte le cose.
    Grazie
  • Re: Typedef. Aiuto!!

    Ovviamente la typedef NON è obbligatoria e puoi farne anche a meno.

    Ma è utilissima per facilitare la scrittura (e la lettura) del codice.

    Considera sempre che un programma può essere molto grande (non due linee come hai proposto tu) e scrivere migliaia di volte "struct EL" può non essere comodo.
  • Re: Typedef. Aiuto!!

    @dach94
    No, così è una cosa diversa. Con il tuo codice tu hai dichiarato due struct EL di nome ElementoLista e Lista.
    Io invece avevo fatto una cosa diversa: non avevo dichiarato niente! Avevo semplicemente detto che il tipo ElementoLista corrisponde a una struct EL, mentre il tipo Lista corrisponde a un puntatore a una struct EL. Praticamente avevo definito degli alias (non so se sia corretto dire così, ma spero di aver reso chiaro il concetto).
    Praticamente se faccio
    typedef struct EL ElementoLista
    significa che da ora in poi potrò utilizzare la parola "ElementoLista" come se fosse "int", "char", ... definendo una struct EL. Quindi, se vuoi un'equivalenza, possiamo dire che
    ElementoLista elem;
    corrisponde a scrivere
    struct EL elem;
  • Re: Typedef. Aiuto!!

    Ma io dico, anche leggendo wikipedia

    "typedef è una parola chiave dei linguaggi di programmazione C e C++. Lo scopo della typedef è quello di assegnare dei nomi alternativi a dei tipi di dato esistenti, solitamente a quelli la cui dichiarazione standard è troppo ingombrante, magari confusionale, oppure per rendere il codice riutilizzabile più facilmente tra un'implementazione e un'altra."

    non ti sembra chiaro il significato e l'utilizzo della typedef ...? Soprattutto l'ultima parte ...

    Se vuoi utilizzare un tipo di dato PINCOPALLO in tutti i tuoi programmi, a prescindere dal PC in cui compilerai il programma, la typedef è utilissima per fare riferimento una sola volta al tipo di dato utilizzato in quel contesto. Pensa ad un CHAR che è sempre un carattere ma può essere ASCII o UNICODE ...
  • Re: Typedef. Aiuto!!

    Facciamo un esempio, pensa di dover leggere un file byte per byte come dichiari la variabile?
    Hai un'unica opzione nel c ovvero "unsigned char" che oltre ad essere decisamente lunga è anche alquanto furviante, sicuramente sarebbe piu elegante scrivere byte,bene allora basta fare:
    "typedef unsigned char byte" ed eccoti il tuo "tipo" byte.
    E se volessi usare una variabile a 32 bit priva di significato,ovvero che non sia un int o quantaltro proprio come l'assembly? facile:
    "typedef unsigned int dword" ed eccoti la dword dell'assembly....
    E le stringhe?
    "typedef char* string"
    naturalmente questo costrutto è una "sega mentale" dei programmatori, creata solo per aumentare la leggibilità del codice e altre piccole diavolerie.
Devi accedere o registrarti per scrivere nel forum
8 risposte