2010-08-06 8 views
8

Angenommen, ich mag ein globales Array von Daten über mein Programm teilen, zum Beispiel:Wie Deklarationen von externen Arrays (und doppelte Arrays) in C-Headerdateien korrekt geschrieben werden?

int lookup_indexes[] = { -1, 1, 1, -1, 2, 1, 1, -2, 2, 2, -1, 1, 1, 2 }; 

Was die richtige extern Erklärung für dieses Array in der Datei C-Header ist?

Auch was über ein Array wie folgt aus:

int double_indexes[][5] = { { -1, 1, 1, -1, 1 }, { 2, -2, 2, 1, -1 } }; 

In meiner Header-Datei ich das versucht:

extern int lookup_indexes[]; 
extern int double_indexes[][5]; 

Aber dies führt zu Compiler-Fehler:

water.h:5: error: array type has incomplete element type 

ich kann Ich verstehe es nicht.

Danke, Boda Cydo.

+0

Können Sie nach dem Inhalt der 'water.h' zumindest bis zur Linie 5 und zeigt, welche Linie den Fehler verursacht. –

+0

Charles, es ist #ifndef, #define, eine neue Zeile und 'extern int lookup_indexes [];' (4. Zeile) und 'extern int double_indexes [] [5];' (5. Zeile). – bodacydo

+0

er wollte es in deine Frage bringen. Einfach anhängen. – detly

Antwort

6

This Link behandelt die Probleme mit Arrays und Größen als extern verwendet und wie Sie sie verwalten.

  1. Deklarieren einen Begleiter Variable, um die Größe des Arrays enthalten, definiert und initialisiert (mit sizeof) in der gleichen Quelldatei, wo das Array definiert ist
  2. offensichtliche Konstante für die Größe definieren, so dass es konsequent in der Definition und die externen Erklärung

  3. Verwenden einig Sentinel-Wert (in der Regel 0, -1, oder NULL) in dem letzten Elemente des Arrays, verwendet werden, so dass der Code das Ende ohne eine explizite Größenangabe bestimmen kann
+0

+1 für die Array-Größe zu erwähnen. Der Compiler hat einfach keine Informationen über die Größe des Arrays, wenn es nicht explizit in der Header-Datei deklariert ist. – chrmue

+0

Ich glaube nicht, dass dies das Problem oder die Frage des OP ist: Er möchte nicht die Größe seiner Arrays wissen, Er will sie nur richtig deklarieren. Links die C-FAQ sind immer gut natürlich. – schot

2

Der von Ihnen gepostete Code sieht für mich gut aus und kompiliert (gcc -std=c99 -pedantic und gcc -std=c90 -pedantic) auf meinem Computer. Haben Sie diese Zeilen kopiert oder könnten Sie einen Tippfehler in Ihrer Kopfzeile eingefügt haben?

Beispiel Tippfehler, die Ihre Fehler (reine Spekulation) verursachen könnten:

extern int double_indexes[][]; /* forgot the 5 */ 
extern int double_indexes[5][]; /* [] and [5] swapped */ 
+0

Danke, lass mich verifizieren. – bodacydo