2012-03-24 13 views
9

Mam strukturę, która ma w sobie kilka tablic. Tablice mają typ unsigned char [4].Inicjalizuj wartości macierzy w struct

mogę zainicjować każdego elementu przez wywołanie

struct->array1[0] = (unsigned char) something; 
... 
struct->array1[3] = (unsigned char) something; 

prostu zastanawiasz się, czy istnieje sposób, aby zainicjować wszystkie 4 wartości w jednej linii.

ROZWIĄZANIE: Musiałem utworzyć tymczasową tablicę ze wszystkimi zainicjowanymi wartościami, a następnie wywołać memset(), aby skopiować wartości do tablicy struct.

+0

Wszystkie te same wartości? – hmjd

+0

Muszę powiedzieć, że jest to tak dobrze znane, że niektóre googlowanie szybko ujawniłoby odpowiedź ... http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c ;-) – tchap

Odpowiedz

5

Jeśli wartości są takie same, możesz zrobić coś hing jak

struct->array[0] = struct->array[1] = struct->array[2] = struct->array[3] = (unsigned char) something; 

W przeciwnym razie, jeśli wartości są przechowywane w tablicy, można użyć funkcji memcpy jak tak

memcpy(struct->array, some_array, sizeof(struct->array)); 
+0

To było to, co musiałem zrobić. Próbowałem utworzyć tablicę temp i uczynić ją równoprawną, ale musiałem ją zapamiętać. Dzięki! –

23

Jeśli naprawdę znaczy „zainicjować” w tym sensie, że można to zrobić w momencie zadeklarować zmienną, a następnie, że:

struct x { 
    unsigned char array1[4]; 
    unsigned char array2[4]; 
}; 

struct x mystruct = { 
    { 1, 2, 3, 4 }, 
    { 5, 6, 7, 8 } 
}; 
+0

Mam na myśli więcej w tym sensie, że po utworzeniu struktury do edycji każdej wartości za pomocą tablic. –

+3

Gotcha - wtedy możesz użyć 'memset()', aby ustawić je wszystkie na taką samą wartość, lub utworzyć tablicę szablonów i 'memcpy()' jeśli chcesz, żeby były inne. Poza tym, prawie wszystko, co możesz zrobić, to przypisać je jeden po drugim. –

+0

Dzięki, ten zestaw jest tym, czego potrzebowałem. –

2

Tak:

struct Foo 
{ 
    unsigned char a[4]; 
    unsigned char b[4]; 
}; 

struct Foo x = { { 1, 2, 3, 'a' }, { 'a', 'b', 'c', 0 } }; 
10

podczas tworzenia struct, możesz go zainicjować za pomocą agregacyjnej inicjalizacji:

struct test { 
    int blah; 
    char arr[4]; 
}; 

struct test = { 5, { 'a', 'b', 'c', 'd' } }; 
2

widzę masz wskaźnik (prawda?).

Jeśli pamięć zostanie przypisana do wskaźnika za pomocą calloc(), wszystko wewnątrz struktury zostanie zainicjowane za pomocą 0.

W przeciwnym razie musisz memset() ustawić na 0 lub przypisać wartość element po elemencie.

memset(struct_pointer, 0, sizeof *struct_pointer); 
+0

Dziękuję. Pomógł mi fragment memsetu. –

0

Można też pętla:

for(i = 0; i < 4; i++) the_struct->array1[i] = (unsigned char) something; 

To będzie działać nawet wtedy, gdy nie masz char ale np int (i wartości! = 0). W rzeczywistości, przyporządkowanie do, powiedzmy, 1 struktury zbudowanej z int (gdy size int jest większe niż 1) nie jest prawidłowym sposobem inicjalizacji.

Powiązane problemy