2008-12-12 16 views
5

Ich habe eine Struktur, die eine Arrays einer anderen Struktur enthält, sieht es so etwas wie dieses:Verschachtelte Strukturen/Arrays Initialisierung


typedef struct bla Bla; 
typedef struct point Point; 

struct point 
{ 
    int x, y; 
}; 

struct bla 
{ 
    int another_var; 
    Point *foo; 
}; 

Ich möchte sie jetzt im globalen Bereich initialisieren. Sie sind als Beschreibung eines Moduls gedacht. Ich habe versucht, dass Literale mit c99-Verbindung zu tun, aber der Compiler (gcc) hat es nicht mag:


Bla test = 
{ 
    0, (Point[]) {(Point){1, 2}, (Point){3, 4}} 
}; 

ich folgende Fehler:

 
error: initializer element is not constant 
error: (near initialization for 'test') 

Da brauche ich nicht zu ändern es kann ich so viele "const" darin wie nötig setzen. Gibt es eine Möglichkeit, es zu kompilieren?

Antwort

5

Sie brauchen keine Verbindung wörtliche für jedes Element nur eine einzige Verbindung wörtliche Array erstellen:

Bla test = 
{ 
    0, (Point[]) {{1, 2}, {3, 4}} 
}; 

Stellen Sie sicher, mit -std=c99 kompilieren.

+0

Ordnet das dynamisch den Speicher für die zwei "Punkte" zu? – aib

+0

@aib: Ja, es erstellt ein Array von zwei literalen "Punkt" -Strukturen (mit statischer Speicherdauer, da es sich im Dateibereich befindet) und initialisiert das "foo" -Member von "test", um auf sie zu zeigen. Es ist eine Abkürzung, die dem Definieren eines Arrays separat und dem Zuweisen des "foo" -Members entspricht, um auf es zu verweisen. –