Discussion:
Fehler "initialization of flexible array member in a nested context"
(zu alt für eine Antwort)
Jochen Hub
2005-06-15 13:23:39 UTC
Permalink
Hi,

ich versuche ein Array einer Struktur zu initialisieren:

typedef struct{
char * name;
char * eintraege[];
} t_meine_Struktur;

/* Das klappt ohne Probleme: */
t_meine_Struktur einzelne_Struktur = {"Name1", {"Eintrag1","Eintrag2"}};

/* Hier gibt's den Fehler "initialization of flexible array member in a
nested context" :*/
t_meine_Struktur Array[] = {
{"Name1", {"Eintrag1","Eintrag2"}},
{"Name2", {"Eintrag1","Eintrag2"}}
};

int main(){}

Compilieren fruehrt zu

test.c:12: error: initialization of flexible array member in a nested
context
test.c:12: error: (near initialization for `Array[0].eintraege')

Kann es sein, dass das, was ich hier versuche, gar nicht moeglich ist,
da so ein Flexibles Array "eintraege" irgendwo in der Mitte meines
Arrays auftaucht? Wie geht ihr vor, wenn ihr eine aehnliche Struktur
braucht?

Vielen Dank schon mal,
Jochen
Jochen Hub
2005-06-15 13:32:23 UTC
Permalink
Post by Jochen Hub
Hi,
typedef struct{
char * name;
char * eintraege[];
} t_meine_Struktur;
Mir ist gerade ne einfache Loesung eingefallen, einfach

#define MAX_N_EINTRAEGE 20
typedef struct{
char * name;
char * eintraege[MAX_N_EINTRAEGE];
} t_meine_Struktur;

Nicht so flexibel, aber es laeuft... ;-)
Stefan Reuther
2005-06-15 16:09:26 UTC
Permalink
Post by Jochen Hub
Post by Jochen Hub
typedef struct{
char * name;
char * eintraege[];
} t_meine_Struktur;
Mir ist gerade ne einfache Loesung eingefallen, einfach
#define MAX_N_EINTRAEGE 20
typedef struct{
char * name;
char * eintraege[MAX_N_EINTRAEGE];
} t_meine_Struktur;
Die C90-Lösung wäre
typedef struct {
char* name;
char** eintraege;
} t_meine_Struktur;

char* eintraege1[] = { "Eintrag1", "Eintrag2" };
char* eintraege2[] = { "Eintrag3", "Eintrag4" };
t_meine_Struktur Array[] = {
{ "Name1", eintraege1 },
{ "Name2", eintraege2 }
};
Hat natürlich einen anderen Aufbau im Speicher.

In C99 kannst du zur Initialisierung dieses Teils auch Verbund-Literale
verwenden.
t_meine_Struktur Array[] = {
{ "Name1", (char*[]){"Eintrag1", "Eintrag2"}},
{ "Name2", (char*[]){"Eintrag3", "Eintrag4"}}
};

(Ansonsten würde ich mit const noch etwas großzügiger umgehen.)


Stefan

Christian Kandeler
2005-06-15 14:55:30 UTC
Permalink
Post by Jochen Hub
Hi,
typedef struct{
char * name;
char * eintraege[];
} t_meine_Struktur;
/* Das klappt ohne Probleme: */
t_meine_Struktur einzelne_Struktur = {"Name1", {"Eintrag1","Eintrag2"}};
/* Hier gibt's den Fehler "initialization of flexible array member in a
nested context" :*/
t_meine_Struktur Array[] = {
{"Name1", {"Eintrag1","Eintrag2"}},
{"Name2", {"Eintrag1","Eintrag2"}}
};
int main(){}
Compilieren fruehrt zu
test.c:12: error: initialization of flexible array member in a nested
context
test.c:12: error: (near initialization for `Array[0].eintraege')
Kann es sein, dass das, was ich hier versuche, gar nicht moeglich ist,
da so ein Flexibles Array "eintraege" irgendwo in der Mitte meines
Arrays auftaucht? Wie geht ihr vor, wenn ihr eine aehnliche Struktur
braucht?
So ist es. Eine Struktur, die einen solchen "flexible array member" hat, ist
laut Standard ein "incomplete type". Diese Datentypen haben unter anderem
die Eigenschaft, daß von ihnen keine Arrays gebildet werden dürfen.


Christian
Juergen Ilse
2005-06-15 17:40:26 UTC
Permalink
Hallo,
Post by Jochen Hub
typedef struct{
char * name;
char * eintraege[];
} t_meine_Struktur;
/* Das klappt ohne Probleme: */
t_meine_Struktur einzelne_Struktur = {"Name1", {"Eintrag1","Eintrag2"}};
Soweit korrekt ...
Dir ist aber schon klar, dass die Groesse dieser Struktur nicht konstant
sondern von der Anzahl der Elemente im array eintraege abhaengig ist,
oder?
Post by Jochen Hub
/* Hier gibt's den Fehler "initialization of flexible array member in a
nested context" :*/
t_meine_Struktur Array[] = {
{"Name1", {"Eintrag1","Eintrag2"}},
{"Name2", {"Eintrag1","Eintrag2"}}
};
Denn genau deswegen gibt es hier Probleme.
Post by Jochen Hub
int main(){}
Compilieren fruehrt zu
test.c:12: error: initialization of flexible array member in a nested
context
test.c:12: error: (near initialization for `Array[0].eintraege')
Kann es sein, dass das, was ich hier versuche, gar nicht moeglich ist,
da so ein Flexibles Array "eintraege" irgendwo in der Mitte meines
Arrays auftaucht? Wie geht ihr vor, wenn ihr eine aehnliche Struktur
braucht?
Ueberleg dir, wie viele Elemente in eintraege auftauchen koennen
und nimm ein array mit ausreichend grosser *fester* Groesse oder
setz in deine Struktur kein array sondern einen Pointer rein
(in dem Fall musst du zur Laufzeit den Speicher fuer das array
anfordern und die startadresse des angeforderten Speicherblocks
an den Pointer zuweisen, und die Initialisierung muss dann natuerlich
auch zur Laufzeit erfolgen ...).

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Loading...