2015-04-24 12 views
6

wiem jak zainicjować konstrukcjom (zazwyczaj), ale mam problemy z tym struktury wewnątrz rzeczy structStruct Błąd inicjalizacji

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

typedef struct Person{ 
    loc location; 
} person; 

zmiennych globalnych:

static person hero; 

funkcji inicjalizacji:

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? Twoja pierwsza inicjalizacja nie * nie * kompiluje. Masz 4 skalary wewnątrz '{}' i tylko 2 skalarne elementy w strukturze. Jest to błąd w C. – AnT

+0

Mniej lub bardziej duplikat do: http://stackoverflow.com/q/24138140/694576 – alk

+0

możliwy duplikat [Jak zainicjować strukturę w ANSI C] (http://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-ansi-c) – alk

Odpowiedz

3

Twoja linia "ta kompilacja" jest poprawna; to inicjalizacja. Pozostałe dwie linie nie kompilują się, ponieważ nie są inicjacjami, są przypisaniami. Jeśli używasz wystarczająco nową wersję C, można użyć związek dosłownego wykonać zadania:

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

Uwaga - swoją deklarację person hero w InitializeHero cieni zmiennej globalnej; prawdopodobnie tego nie chcesz.

BTW, brakuje niektórych pól w swoim person? Nic z tego nie powinno się kompilować z tym, co pokazałeś.

+0

Tak, moje złe. Przepraszam za brakujące pola (czy nazywane są skalarami?) – Justin

+0

Jaki jest cel literałów złożonych? Czy dla jasności? Ponieważ wydają się nieco zbędne – Justin

1

Linia wskazująca, że ​​kompilacja generuje ostrzeżenie. Rozdzielmy twoją funkcję InitializeHero.

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

Tutaj jesteś uruchamianiu nowego person struct nazwie hero. Użyj metody inicjowania nawiasów, aby ustawić członków struktury. W tym przypadku jedynym członkiem person jest loc. Sam model loc ma tylko dwie wersje:,. Używając tutaj metody inicjalizacji nawiasów, po prostu użyjesz {0, 0}.

Połączenie tych dwóch, można napisać oświadczenie jak:

person hero = {{0, 0}};

pamiętać, że można używać tylko podczas inicjalizacji inicjalizacji nawiasów. Pozostałe dwa stwierdzenia to przypisania. Struktura została już zainicjowana w tym momencie, dlatego te dwie instrukcje nie są kompilowane.

Jedna uwaga, Twój zmienna globalna static person hero została zasłonięta przez zmienną lokalnyhero w InitializeHero. Oznacza to, że tworzysz osobną strukturę person w swoim InitializeHero. Jednak ta statyczna zmienna jest inicjowana, gdzie jest zadeklarowane w tym przypadku, więc oświadczenie musi czytać

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

... pozostawiając InitializeHero nieużywane.

+1

Funkcja nadal miałaby swój cel, jeśli ustawi zmienną globalną (a zatem nie zadeklaruje zmiennej lokalnej). Czasami trzeba ponownie zainicjować zmienną globalną i taka funkcja może być odpowiednia. –

Powiązane problemy