2015-04-24 11 views
6

so come inizializzare le strutture (in generale), ma sto avendo problemi con questo struct all'interno di una roba structStruct errore di inizializzazione

typedef struct Location{ 
    uint8_t x; 
    uint8_t y; 
} loc; 

typedef struct Person{ 
    loc location; 
} person; 

variabili globali:

static person hero; 

funzioni di inizializzazione:

void InitializeHero() { 
    person hero = {0,0, {0,0}}; // this compiles 
    hero.location = {0,0}; // but this does not compile 
    hero = {0,0,{0,0}}; // this also does not compile 
} 
+1

Huh? La tua prima inizializzazione non * compila *. Hai 4 scalari dentro '{}' e solo 2 membri scalari nella struttura. Questo è un errore in C. – AnT

+0

Più o meno un duplicato a: http://stackoverflow.com/q/24138140/694576 – alk

+0

possibile duplicato di [Come inizializzare una struttura in ANSI C] (http://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-ansi-c) – alk

risposta

3

La riga "questo compila" è corretta; questa è un'inizializzazione. Le altre due linee non si compilano, perché non sono inizializzazioni, sono assegnazioni. Se si utilizza una nuova versione abbastanza di C, è possibile utilizzare un composto letterale di fare le assegnazioni:

hero.location = (loc){0,0}; 
hero = (person){0,0,{0,0}}; 

Nota - la vostra dichiarazione person hero nel InitializeHero ombre variabile globale; probabilmente non lo vuoi

BTW, ti mancano alcuni campi nel tuo person? Niente di tutto ciò dovrebbe essere compilato con ciò che hai mostrato.

+0

Sì, il mio male. Mi dispiace per i campi mancanti (sono chiamati scalari?) – Justin

+0

Inoltre, qual è lo scopo dei letterali composti? Sono per chiarezza? Perché sembrano ridondanti – Justin

1

La riga che indica che compila genera un avviso. Facciamo a pezzi la tua funzione InitializeHero.

person hero = {0,0, {0,0}};

Qui si sta istanziare la nuova person struct nome hero. Si utilizza il metodo di inizializzazione del controvento per impostare i membri della struct. In questo caso, l'unico membro di person è un loc. Uno stesso loc ha solo due uint8_t s. Usando il metodo di inizializzazione delle parentesi quadre, useresti semplicemente {0, 0}.

La combinazione di questi due, si potrebbe scrivere una dichiarazione come:

person hero = {{0, 0}};

Si noti che è possibile utilizzare solo l'inizializzazione doppietta durante l'inizializzazione. Le altre due dichiarazioni sono assegnazioni. La struttura è già stata inizializzata a questo punto, motivo per cui queste due istruzioni non vengono compilate.

Un'altra nota, la variabile globale static person hero è stato oscurato dalla variabile localehero in InitializeHero. Ciò significa che stai creando una struttura separata person nello InitializeHero. Tuttavia, questa variabile statica viene inizializzata in cui è dichiarata in questo caso, così la sua dichiarazione deve leggere

static person hero = {{0, 0}};

... lasciando InitializeHero inutilizzato.

+1

La funzione avrebbe comunque uno scopo se imposta la variabile globale (e quindi non ha dichiarato la variabile locale). A volte è necessario reinizializzare una variabile globale e una funzione del genere potrebbe essere appropriata. –