2015-04-24 14 views
6

Ben yapılar (genellikle) nasıl başlatıldığını biliyorum ama bir yapı malzeme içindeStruct başlatma hatası

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

typedef struct Person{ 
    loc location; 
} person; 

küresel değişkenleri bu yapı ile sorun yaşıyorum:

static person hero; 

başlatma işlevlerini:

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? İlk başlatmanız * derlenmiyor *. '{}' Içinde 4 skaler ve yapıda yalnızca 2 skaler üyeniz var. Bu, C'deki bir hatadır. – AnT

+0

Şunlar için bir veya daha fazla yinelenen: http://stackoverflow.com/q/24138140/694576 – alk

+0

olası bir kopyası [ANSI C'deki bir yapı nasıl başlatılır] (http://stackoverflow.com/questions/330793/nasıl başlatılır-a-struct-in-ansi-c) – alk

cevap

3

Sizin 'bu derlemeler' çizginiz doğru; Bu bir başlangıç. Diğer iki satır derleme yapmaz, çünkü bunlar başlatma değil, ödevlerdir. Eğer C yeni yeterince sürümünü kullanıyorsanız, Atamaları yapmak değişmezi bir bileşik kullanabilirsiniz:

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

Not - InitializeHero gölgeler küresel değişkeni içinde person hero beyanı; muhtemelen bunu istemiyorsun.

BTW, person'unuzda bazı alanları kaçırıyor musunuz? Hiçbiri gösterdiğiniz şeyle derlenmemelidir.

+0

Evet, kötüyüm. Eksik alanlar için özür dilerim (bunlar skaler denir mi?) – Justin

+0

Ayrıca, bileşik edebi amaçların amacı nedir? Açıklık için mi? Çünkü bunlar çok fazla – Justin

1

Derleme işleminin bir uyarı ürettiğini belirttiğiniz çizgi. InitializeHero işlevinizi parçalayalım. İşte

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

Eğer hero adlı yeni person yapı başlatmasını edilmektedir. Yapının üyelerini ayarlamak için küme başlatma yöntemini kullanırsınız. Bu durumda, person'un tek üyesi bir loc'dur. Bir loc, yalnızca iki adet uint8_t s'ye sahiptir. Burada brace başlatma yöntemini kullanarak, sadece {0, 0} kullanırsınız. başlatırken yalnızca ayracı başlatma kullanabilirsiniz

person hero = {{0, 0}};

Not:

Bu ikisi birleştirerek gibi bir ifade yazabilirsiniz. Diğer iki ifadeniz atamaları. Yapı zaten bu noktada başlatılmıştır, bu yüzden bu iki ifade derlenmez.

Bir diğer habere, global değişken static person heroInitializeHero yılındayerel değişken hero gölgesinde edilmiştir. Bu, InitializeHero ürününüzde ayrı bir person yapısını oluşturduğunuz anlamına gelir. Ancak bu statik değişken bu durumda bildirildi nerede başlatılır, böylece deyim

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

... bırakarak InitializeHero kullanılmayan okumalıdır.

+1

gibi görünüyorlar. Eğer global değişkeni ayarladıysa (ve bu nedenle yerel değişkeni beyan etmediyse) fonksiyonun hala bir amacı olacaktır. Bazen bir global değişkeni ve uygun olabilecek bir işlevi yeniden başlatmanız gerekir. –

İlgili konular