Ich möchte zwei Arrays in einer Struktur haben, die beim Start initialisiert werden, aber weiter bearbeitet werden müssen. Ich brauche drei Instanzen der Struktur, damit ich in eine bestimmte Struktur indizieren und sie nach Belieben ändern kann. Ist es möglich?
Das ist, was ich dachte, ich könnte tun, aber ich bekomme Fehler:
struct potNumber{
int array[20] = {[0 ... 19] = 10};
char *theName[] = {"Half-and-Half", "Almond", "Rasberry", "Vanilla", …};
} aPot[3];
Dann greife ich wie folgt auf die Strukturen zu:
printf("some statement %s", aPot[0].array[0]);
aPot[0].theName[3];
…
Die Struktur selbst enthält keine Daten. Sie müssen Objekte des Strukturtyps erstellen und die Objekte festlegen …
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";
/* ... */
In C struct müssen Array-Elemente eine feste Größe haben, also die char *theNames[]
ist ungültig. Auch können Sie eine Struktur auf diese Weise nicht initialisieren. In C sind Arrays statisch, dh man kann ihre Größe nicht dynamisch ändern.
Eine korrekte Deklaration der Struktur würde wie folgt aussehen
struct potNumber{
int array[20];
char theName[10][20];
};
und du initialisierst es so:
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 */ }
}
};
Aber ich bin mir ziemlich sicher, dass das nicht das ist, was Sie wollen. Der vernünftige Weg, dies zu tun, erforderte einen Boilerplate-Code:
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;
};
Ich persönlich rate dringend davon ab, nackte C-Arrays zu verwenden. Alles über Hilfsstrukturen und -funktionen zu erledigen, hält Sie von Pufferunter-/überläufen und anderen Problemen fern. Jeder ernsthafte C-Programmierer erstellt im Laufe der Zeit eine umfangreiche Code-Bibliothek mit solchen Dingen.
Welche Fehler erhalten Sie?
– Andreas Weiß
2. März 2011 um 16:38 Uhr
Ist das wirklich so bei dir
struct
ist definiert?– Wo
2. März 2011 um 16:46 Uhr