2010-07-27 26 views
16

Aşağıdaki kodun ana işlevde kullanılması gerekir, ancak nasıl kullanıldığını bilmiyorum.Enum ANSI C'deki bir yapının içinde nasıl kullanılır?

struct SomeItem 
{ 
    enum {MOVIE, MUSIC} itemType; 
    union { 
     struct Movie* movie; 
     struct Music* music; 
    }; 
}; 

bu yapı, önceki/madde/sonraki pointer ile dinamik bağlantılı listesinde kullanılır, ama enum ayarlayabilirsiniz bilmiyorum. Ya da nasıl başlatılır.

Ana işlevde nasıl görüneceğini bilmem gerek.

biglist.someitem = ???; 
/* declaration I use */ 
struct Library* biglist; 

daha kod Im yapmaya çalıştığını anlamak için.

struct Library{ 
struct SomeItem* someitem; 
struct SomeItem* previousItem; 
struct SomeItem* nextItem; 
}; 

derleyici hataları: C2037: FİLMİ: 'someitem' sol tanımsız yapı/birliği 'kütüphane' C2065 belirten bildirilmemiş hala tanımlayıcı

Im ANSI C çaylak, bana ok ateş yok ;)

+0

bir nedeni var mı struct declaration dışında "typedef enum" kullanmak istemiyor musunuz? – nmichaels

+3

Yani derleyici hangi kod satırı aslında başarısız? http://catb.org/esr/faqs/smart-questions.html – Dummy00001

+0

İlk hata için, derleyicinin şikayet ettiği satırı göstermiyorsunuz. İkinci hata için, 'struct' tanımlaması bu noktada görünmez veya C++ derleyicisi ile C kodu oluşturmaya çalışıyorsunuzdur. Daha fazla programınızı gönderin, lütfen. Psişik hata ayıklama yapmak zordur. –

cevap

13

Her yerde işaretçiyi kullanıyorsunuz, bu yüzden öğeleri -> referans almak için -> kullanmanız gerekir.

ie. biglist->someitem->itemType = MOVIE;

aşağıdaki kod gcc ile iyi derler -Wall -strict:

struct SomeItem 
{ 
    enum {MOVIE, MUSIC} itemType; 
    union { 
     struct Movie* movie; 
     struct Music* music; 
    } item; 
}; 

struct Library{ 
    struct SomeItem* someitem; 
    struct SomeItem* previousItem; 
    struct SomeItem* nextItem; 
}; 

int main(void) 
{ 
    struct Library* biglist; 

    biglist->someitem->itemType = MOVIE; 

    return 0; 
} 

(bu kod ben biglist için herhangi bir bellek tahsis ve someitem değilim olarak, elbette yayınlanmaz olsa!)

+0

Teşekkürler! ikinizde! – TheDudeAbides

+0

Yapısında yararlı olması için sendikaya isim vermelisin? Siddique'in cevabı gibi. – user982671

+0

@ user982671 Evet, iyi nokta, bunu güncelledim.(Referans olarak, anonim sendikalara gcc'de ve ayrıca C11'den itibaren ANSI C'de izin verilir.) – JosephH

4
biglist.someitem.itemType = MOVIE; /* or = MUSIC */ 

Veya someitem bir işaretçi olduğu takdirde

biglist.someitem->itemType = MOVIE; /* or = MUSIC */ 
+0

Teşekkürler Tyler, bunu yapmaya çalıştım, ancak program hala derlenmeyecek. Ek kod vermek zorunda olduğumu hissediyorum .. – TheDudeAbides

+0

Değeri ayarlamak için kullandığınız kodu (ilgili tüm değişkenler için bildirimler dahil) ve derleyici tarafından oluşturulan tam hata iletisini deftere nakletmelisiniz. Ve bu şeyleri sorunuza göre düzenleyin; Bir yorum olarak yanıtlamayın. –

+0

Bunu şimdi yaptık. – TheDudeAbides

0
struct SomeItem 
{ 
    enum {MOVIE, MUSIC} itemType; 
    union { 
     struct Movie* movie; 
     struct Music* music; 
    } item; 
    struct SomeItem *next; 
}; 
0

Enum'u böyle bir şekilde başlatabilirsiniz biglist-> someitem = MOVIE; ancak derleyici tamsayı değerleri Yani 0'dan başlayarak atar: FİLMİ birisi iyi yardımcı olur 0 veya biglist-> someitem = MÜZİK dönüş 1

çek döndürür biglist-> someitem = ,

İlgili konular