Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] struttura in progetto visual studio/codeblocks

    salve a tutti, mi ritrovo a dover inserire una struttura in un semplice progetto visual studio e codeblocks

    codice:
    typedef struct giocatori {
    
        char nome[7];
    
        char cognome[7];
    
        int ruolo;
    
    } squadra;
    
    struct squadra {
    
        squadra formazione[11];
    
        char *nome_squadra;
    
        int vittorie;
    
    } campionato[8];
    in particolare mi da problemi con "squadra formazione[11];" e non capisco perchè... quando l'ho fatto in un file singolo con codeblocks, non mi dava nessun tipo di errore... dove devo inserire queste struttre nel file delle funzioni, in quello degli header oppure nel main ?,
    un altra cosa che non riesco a capire è, se io ho una funzione in C posso passare una struttura come argomento? se si come?.

    grazie mille.

  2. #2
    non dovrebbe essere
    codice:
    giocatori formazione[11];

  3. #3
    no... non va.

  4. #4
    Scusa eh... ma stai facendo un typedef per struct giocatori rinominandolo squadra, e poi crei una struct squadra?

    Mi pare che avrebbe più senso una roba del tipo:
    codice:
    typedef struct {
        char nome[7];
        char cognome[7];
        int ruolo;
    } giocatore;
    
    typedef struct {
        giocatore formazione[11];
        char *nome_squadra;
        int vittorie;
    } squadra;
    
    squadra campionato[8];
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    in effetti, non ho fatto molta pratica e in verità non le avevo neanche capite dal punto di vista di "sintassi", ora vorrei sapere ma come si passa, una struttura come argomento di una funzione? io ho provato con:

    void crea_giocatori(struct giocatore, struct squadra)

    ma non mi funziona.... per caso devo usare i puntatori, o la sintassi è sbagliata?.

    grazie ancora per l'aiuto.

  6. #6
    In primo luogo devi decidere se usare la sintassi "struct NomeStruttura" o "NomeStruttura e basta" per chiamare le strutture.

    In C, a differenza del C++, il nome del tipo delle strutture normalmente devono essere preceduti da struct. Se cioè tu dichiari una struttura di questo genere:
    codice:
    struct Punto
    {
        int x;
        int y;
    };
    poi, per creare una variabile che abbia il tipo della struttura e usarla dovrai fare
    codice:
    struct Punto UnPunto;
    UnPunto.x=100;
    UnPunto.y=36;
    .
    Alcuni trovano seccante dover riscrivere struct tutte le volte, nel qual caso si ricorre ad un workaround: si crea una struttura anonima e se ne crea un alias tramite typedef; dato che gli alias creati tramite typedef non necessitano di "struct" davanti, si può fare così:
    codice:
    typedef struct /* nota che qui non ho specificato il nome */
    {
        int x;
        int y;
    } Punto;
    
    /* ... */
    
    Punto UnPunto;
    UnPunto.x=100;
    UnPunto.y=36;
    Stabilito quale sintassi utilizzare (è bene non mischiarle onde evitare casini), viene da sé la dichiarazione di funzioni a cui passare delle strutture.
    La scelta del passaggio per puntatore o per copia dipende da considerazioni logiche e da considerazioni di efficienza.
    Se la funzione deve modificare il contenuto della struttura, la struttura andrà passata per forza via puntatore (altrimenti le modifiche effettuate dalla funzione si ripercuoteranno solo sulla copia della struttura locale alla funzione):
    codice:
    void Funzione(struct Punto * Pt);
    /* oppure, a seconda della scelta della sintassi da seguire */
    void Funzione(Punto * Pt);
    Se la struttura è piccola e la funzione non la deve modificare, allora va più che bene il passaggio per valore:
    codice:
    void Funzione(struct Punto Pt);
    /* oppure, a seconda della scelta della sintassi da seguire */
    void Funzione(Punto Pt);
    Qualora la struttura fosse piuttosto grande e l'overhead relativo alla copia quindi sia sensibile, è preferibile usare comunque il passaggio per puntatore. Se la funzione non deve comunque modificare la struttura, un modo per rendere chiaro ciò è usare un puntatore costante:
    codice:
    void Funzione(const struct Punto * Pt);
    /* oppure, a seconda della scelta della sintassi da seguire */
    void Funzione(const Punto * Pt);
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    ti ringrazio, tanto per la spiegazione mi ha aiuto molto, ma cosa si intende per "modificare la struttura" ? , cioè modificarla togliendo campi tipo da
    codice:
    struct punto {
    
    punto x;
    
    punto y;
    
    }
    togli il campo y per esempio... oppure si intende tipo aggiungere valori ad un array di una struttura tramite ciclo o cose del genere?

  8. #8
    Il C è un linguaggio a tipizzazione statica, non puoi modificare i tipi a runtime. Per "modificare la struttura" intendo modificare i valori dei suoi campi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    capito... ora è tutto più chiaro,
    e come faccio a richiamare una funzione una volta creata, che come parametri ha una struct ?

  10. #10
    Supponiamo di avere la nostra ipotetica struttura punto
    codice:
    typedef struct
    {
        int x;
        int y;
    } Punto;
    e vogliamo scrivere una funzione che calcoli la distanza tra due punti: allora faremo una cosa del genere
    codice:
    double Distanza(const Punto * Pt1, const Punto * Pt2)
    {
        return pow(pow(Pt1->x-Pt2->x,2)+pow(Pt1->y-Pt2->y,2));
    }
    per richiamare questa funzione, basterà fare:
    codice:
    Punto a, b;
    double distanza;
    a.x=10;
    a.y=25;
    b.x=63;
    b.y=24;
    distanza=Distanza(&a, &b);
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.