2010-05-14 25 views
6

I düzeylerinin bir dizi oyun adlandırılan bir yapı, bu gibi tanımlanmıştır: Bölümleme hata sorunu (C)

typedef struct 
{ 
    Level levels[x]; 
} Game; 

X 1, 2 ya da 3, program çalışır olup olmadığını, kod derleme

normalde. Eğer başka bir değerse (örneğin 4), bir segmentasyon hatası alıyorum. Diziye herhangi bir yerden erişemiyorum.

int main (...) 
{ 
    Game g; 

    return 0; 
} 

Bunun ne olabileceği herhangi bir ipucu: Ana (yorumladı başlatma hariç herşey) şu anda böyle bir şey mi?

Şimdiden teşekkürler.

+3

Statik tahsise giderken, "level" in ne olduğunu veya en azından boyutunun ne olduğunu görebilir miyiz? Onun kocaman bir önsezi var. –

cevap

4

Level ne kadar büyük? Yığını taşırken mümkün mü? static Game g;

Düzenleme:: öbek üzerindeki tahsis zorlamak istiyorsanız , Bence sadece hiç bir Oyun belki gibi static saklama sınıfı kullanılarak daha iyi olurdu, neyse nesne (görünüşte) var olduğunu göz önüne alındığında işaretçileri doğrudan kullanmak yerine std::vector<Level> levels; numaralı telefonu kullanmanızı tavsiye edin. Oops - C++ olarak etiketlenemedi.

typedef struct { 
    Level *levels; 
} Game; 

ve sonra malloc() veya yeni ile seviyeleri tahsis: Seviye sınıfı/yapı gerçekten büyükse

+2

Muhtemelen yığının taştığını kabul ediyorum, fakat soru C++ değil. –

+0

Ya da g ifadesini main() işlevinin dışına taşıyabilirsiniz. –

+0

Öneriniz için teşekkürler. Sadece bir nesneye sahip olduğum için statik kullandım ve bu şekilde çalışıyor.Program bilgisayarımda bir bölütleme hatasına neden olmadı, ama o zaman kullanmakta olduğum zamana neden oldu (bu gerçekten çok eskiydi, bu muhtemelen problemdi). Seviye büyük bir sınıf ama bunun bir segmentasyon hatasına neden olmayacağını farz ettim. – user228938

5

, bu kullanarak deneyebilirsiniz. Böyle bir şey

sonra
typedef struct { 
    Level* levels[NUM_LEVELS]; 
} Game; 

tahsis düzeylerini: Eğer gerçekten seviyelerinin bir dizi gerekiyorsa Ya da benim makinede

// Allocate levels 
int i; 
for(i=0;i<NUM_LEVELS;i++) { 
    gameStruct.levels[i] = (Level*)malloc(sizeof(Level)); 
    initLevelNum(gameStruct.levels[i], i); 
} 
4

Bu kodu

typedef struct { 
    char data[65536*4]; 
} Level; 

typedef struct 
{ 
    Level levels[4]; 
} Game; 

int main (...) 
{ 
    Game g; 

    return 0; 
} 

çöker, o değil iken levels dizisinin boyutunu 3 olarak değiştirirsem.

Etmeli ya da ya da yığın üzerinde seviyelerini koyarak (yerine yığının yığın verileri koyarak) sizin Level tipi boyutunu küçültmek (işaretçiler dizisi onları tutarak dinamik Level nesneleri tahsis etmek) .

+0

Ayrıca dünyayı global hale getirebilirsiniz. Muhtemelen böyle bir sorun olmayacak şekilde kullanılmaz. – nategoose

0

Eğer gerçekten verilerinizin boyutuna sahip ve bu bir seçenek olacaktır bağlayıcı üzerindeki yığın boyutunu ayarlama belki tahsis yığını olan ısrar edin. ben yanlış isem ben ilginç konuyu buldukça beni düzeltin lütfen

0

Genellikle benzer durumlarda değişken statik beyan etmelidir:

Böylece değişken tahsis ve derlenmiş statik bölgeye yerleştirilen olacaktır
int main(void) { 
    static struct foo bar[SIZE]; 

    return 0; 
} 

zaman.