C: Wie ein Array mit def. Konst. initialisieren

Hallo,
ich habe eine Array mit fünf Elementen. Das Array soll bei seiner Deklaration initialisiert werden. Vorher hatte ich in meinem Headerfile mehrere Definierungen (Macros) um konstante Werte an einer Stelle im Code aufzuführen (z.B. #define Untergrenze 3). Nun habe ich die die Konstanten als richtige Konstanten in der *.c Datei deklariert (z.B. static const unsigned char Untergrenze = 3:wink:

Das Array wollte ich nun so initialisieren:

unsigned char Settings[5] = { // parameters (saved)
Untergrenze, Obergrenze,
0, 0, 0,
};

Der GCC Compiler gibt folgende Fehlermeldung aus:
Xmasleds.c:63: error: initializer element is not constant
Xmasleds.c:63: error: (near initialization for ‚Settings[0]‘)

Ich möchte jedenfalls nur an einer Stelle im Code die Konstante eintragen. Was kann ich tun?

Danke im Voraus

Andre

Code:

#include 

static const unsigned char T\_lo = 3;
static const unsigned char T\_hi = 10;

int main(void)
{
 unsigned char setting[5] = { T\_lo, T\_hi, 0, 0, 0 };
 printf("%d %d\n", setting[0], setting[1]);
 return 0;
}

Compile:

gcc -Wall -o test test.c 

Run:

./test.exe 
3 10

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Code:

#include

static const unsigned char T_lo = 3;
static const unsigned char T_hi = 10;

int main(void)
{
unsigned char setting[5] = { T_lo, T_hi, 0, 0, 0 };
printf("%d %d\n", setting[0], setting[1]);
return 0;
}

Compile:

gcc -Wall -o test test.c

Run:

./test.exe
3 10

Danke für die schnelle Antwort.
Dein Code sieht ja genauso aus wie meiner. Nur dass es bei Dir geht.
Der Compiler, den ich verwende ist der WinAVR GCC 4.2.2 eventuell muss ich dann bei den AVR Freaks posten.

Andre

Hallo,

ich habe eine Array mit fünf Elementen. Das Array soll bei
seiner Deklaration initialisiert werden. Vorher hatte ich in
meinem Headerfile mehrere Definierungen (Macros) um konstante
Werte an einer Stelle im Code aufzuführen (z.B. #define
Untergrenze 3). Nun habe ich die die Konstanten als richtige
Konstanten in der *.c Datei deklariert (z.B. static const
unsigned char Untergrenze = 3:wink:

Das Array wollte ich nun so initialisieren:
unsigned char Settings[5] = { // parameters (saved)
Untergrenze, Obergrenze,
0, 0, 0,
};
Ich möchte jedenfalls nur an einer Stelle im Code die
Konstante eintragen. Was kann ich tun?

Du möchtest offensichtlich ein Feld außerhalb eines
Funktionsblocks, sprich „außerhalb des Stacks“ initialisieren,
und zwar mit Variablen. Das geht in C nicht. const erzeugt
keine Konstante in dem von Dir gemeinten Sinne. Du könntest es
entweder so machen:

...
#define OBERGRENZE 3
#define UNTERGRENZE 5

static const unsigned char Untergrenze = OBERGRENZE;
static const unsigned char Obergrenze = UNTERGRENZE;

unsigned char Settings[5] = { OBERGRENZE, UNTERGRENZE, 0, 0, 0 };
/\* ein globales Feld ist automatisch auf dem Heap (nicht auf dem Stack) \*/
...

… oder eben die Initialisierung in einer Funktion (das ist dann
eben nicht static sondern automatisch auto) durchführen.

Grüße

CMБ

Du möchtest offensichtlich ein Feld außerhalb eines
Funktionsblocks, sprich „außerhalb des Stacks“ initialisieren,
und zwar mit Variablen. Das geht in C nicht.
const erzeugt
keine Konstante in dem von Dir gemeinten Sinne. Du könntest es
entweder so machen:


#define OBERGRENZE 3
#define UNTERGRENZE 5

static const unsigned char Untergrenze = OBERGRENZE;
static const unsigned char Obergrenze = UNTERGRENZE;

unsigned char Settings[5] = { OBERGRENZE, UNTERGRENZE, 0, 0, 0
};
/* ein globales Feld ist automatisch auf dem Heap (nicht auf
dem Stack) */

… oder eben die Initialisierung in einer Funktion (das ist
dann
eben nicht static sondern automatisch
auto) durchführen.

Grüße

CMБ

Danke für Deine schnelle Antwort.
schade, dass es so nicht geht. Dann kann ich eigendlich auch gleich bei dem #define Konstrukt bleiben. Das Andere ist ja denn nur aufgeblasener Code. Die Typenüberprüfung kann ja auch durch:
#define Untergrenze (unsigned char)3
realisiert werden.
Ich hatte nur vor im Hinblick auf spätere Portierung auf C++ diese Makros zu ersetzen.

Andre