2016-05-08 22 views
0

Ich möchte C99 designierte Array-Initialisierer verwenden, um meinen Code selbstdokumentierender zu machen, aber ich stoße auf das unten beschriebene Problem."Array-Index im Initialisierer überschreitet Array-Grenzen"

glaube, ich habe eine Aufzählung und eine Anordnung Abbilden der enumerants auf eine andere nützliche Datenstruktur, zum Beispiel:

enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC }; 
int32_t const g_stress_levels[3] = { 
     [STATE_IDLE] = 10, 
     [STATE_WORKING] = 40, 
     [STATE_PANIC] = 90 
}; 

Die oben ohne Warnungen mit TDM-GCC-32 gcc kompiliert 4.8.1 und -std=c99 . Das folgende Codefragment verursacht nicht den Fehler "Array-Index im Initialisierer überschreitet Array-Grenzen".

enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC, TOTAL_STATES }; 
int32_t const g_stress_levels[TOTAL_STATES] = { 
     [STATE_IDLE] = 10, 
     [STATE_WORKING] = 40, 
     [STATE_PANIC] = 90 
}; 

The GCC docs Zustand „die Indexwerte müssen konstante Ausdrücke sein, auch wenn das Array initialisiert wird, ist automatisch“. Ich habe immer gedacht, dass enum ein konstanter Ausdruck ist, also warum könnte das der Fall sein?

+1

Dieser Code ist absolut gültig. [Es kompiliert und läuft perfekt mit gcc] (http://ideone.com/dXnbgH). Wenn Ihr Compiler einen Fehler erzeugt, ist das ein Fehler in Ihrem Compiler. Voting zum Schließen als "kann nicht reproduzieren". – dasblinkenlight

Antwort

1

Der Code läuft gut, wie erwartet *:

[email protected]:~$ cat px.c 
#include <stdint.h> 

enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC, TOTAL_STATES }; 
int32_t const g_stress_levels[TOTAL_STATES] = { 
     [STATE_IDLE] = 10, 
     [STATE_WORKING] = 40, 
     [STATE_PANIC] = 90 
}; 

int main(void) { 
    return 0; 
} 
[email protected]:~$ gcc -Wall -std=c99 -o px px.c 
[email protected]:~$ 

Das Problem muss woanders liegen. Sie überprüfen es auch live here.

* Can enum member be the size of an array in ANSI-C?

Verwandte Themen