2011-03-02 18 views
11

Bir yapıda, başlangıçta başlatılan ancak daha fazla düzenlemeye ihtiyaç duyan iki diziye sahip olmak istiyorum. Yapının üç örneğine ihtiyacım var, böylece belirli bir yapıya indeksleyebilir ve istediğim gibi değiştirebilirim. Mümkün mü? aşağıdaki gibi C yapısındaki dizi

struct potNumber{ 
    int array[20] = {[0 ... 19] = 10}; 
    char *theName[] = {"Half-and-Half", "Almond", "Rasberry", "Vanilla", …}; 
} aPot[3]; 

Sonra yapılar erişmek:

printf("some statement %s", aPot[0].array[0]); 
aPot[0].theName[3]; 
… 
+6

Ne tür hatalar alıyorsunuz? –

+3

Bu gerçekten 'struct' tanımınız mı? – birryree

cevap

11

yapı kendileri verimiz yok Bu benim yapabileceğim ama hatalar olsun düşünce budur

. char *theNames[] geçerli değil, böylece sabit bir boyutta olmalıdır C yapı dizi öğelerinin ise

struct potNumber { 
    int array[20]; 
    char *theName[42]; 
}; 

/* I like to separate the type definition from the object creation */ 
struct potNumber aPot[3]; 
/* with a C99 compiler you can use 'designated initializers' */ 
struct potNumber bPot = {{[7] = 7, [3] = -12}, {[4] = "four", [6] = "six"}}; 

for (i = 0; i < 20; i++) { 
    aPot[0].array[i] = i; 
} 
aPot[0].theName[0] = "Half-and-Half"; 
aPot[0].theName[1] = "Almond"; 
aPot[0].theName[2] = "Rasberry"; 
aPot[0].theName[3] = "Vanilla"; 
/* ... */ 

for (i = 0; i < 20; i++) { 
    aPot[2].array[i] = 42 + i; 
} 
aPot[2].theName[0] = "Half-and-Half"; 
aPot[2].theName[1] = "Almond"; 
aPot[2].theName[2] = "Rasberry"; 
aPot[2].theName[3] = "Vanilla"; 
/* ... */ 
+0

Yapıları başlatabileceğinizi unutmayın; crappy biçimlendirmesini affedersiniz: struct potNumber aPot = {{[0] ... [19] = 10}, {"Half-Half", "Badem", "Rasberry", "Vanilya" .......}}; –

+0

@David: Evet, "..." dışında, işe yarıyor. Parçamda yukarıdaki örnek eklendi. Teşekkürler. – pmg

+0

@David: Bunlar çok KİK tarzı başlatmalardır (ve Linux olduğu için GCC'yi kabul ediyorum). Daha önce hiç ........ şeylerini görmedim, bu geçerli mi? – birryree

9

... yapı türündeki nesneleri oluşturmak ve nesneleri ayarlamak gerekir. Ayrıca bir yapıyı bu şekilde başlatamazsınız. C dizileri statiktir, yani, boyutları dinamik olarak değiştirilemez. Ne istediğini bu değil eminim,

struct potNumber aPot[3]= 
{ 
    /* 0 */ 
    { 
     {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, 
     {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ } 
    }, 
    /* 1 */ 
    { 
     {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, 
     {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ } 
    }, 
    /* 2 */ 
    { 
     {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, 
     {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ } 
    } 
}; 

Ama:

yapının doğru bir deklarasyon aşağıdaki

struct potNumber{ 
    int array[20]; 
    char theName[10][20]; 
}; 

gibi görünecektir ve bunu böyle başlatmak.

struct IntArray 
{ 
    size_t elements; 
    int *data; 
}; 

struct String 
{ 
    size_t length; 
    char *data; 
}; 

struct StringArray 
{ 
    size_t elements; 
    struct String *data; 
}; 
/* functions for convenient allocation, element access and copying of Arrays and Strings */ 

struct potNumber 
{ 
    struct IntArray array; 
    struct StringArray theNames; 
}; 

Şahsen ben şiddetle çıplak C dizileri kullanılmamasını öneriyoruz: Bunu yapmanın aklı başında yolu bazı Demirbaş kodu gereklidir. Her şeyi yardımcı yapıları ve işlevleri ile yapmak, arabelleğin altından/aşağısından ve diğer sorunlardan uzak kalmanızı sağlar. Her ciddi C kodlayıcısı, zamanla bu gibi şeylerle bir alt kod kütüphanesi oluşturur.

+2

ok Yardımlarınız için teşekkürler, veriye nasıl gireceğimi ve nasıl erişeceğimi gösteren bir örnek verebilir misiniz? – Greg