C: Wie ein Array mit def. Konst. initialisieren

Von: , Frage gestellt am Di, 27. Mai 2008

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;)

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

4 Antworten zu dieser Frage

  1. Antwort von nach 20 Minuten 0 hilfreich
    Re: C: Wie ein Array mit def. Konst. initialisiere

    Code:

    #include <stdio.h>
    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]

    • Antwort von nach 31 Minuten 0 hilfreich
      Re^2: C: Wie ein Array mit def. Konst. initialisie


      Code:

      #include <stdio.h>
      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

  2. Antwort von nach 32 Minuten 0 hilfreich
    Re: C: Wie ein Array mit def. Konst. initialisiere

    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;)

    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Б

    • Antwort von nach 47 Minuten 0 hilfreich
      Re^2: C: Wie ein Array mit def. Konst. initialisie


      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

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!