Forum: Compiler & IDEs Array vorbelegen und Anzahl Einträge in enum?


von jemand (Gast)


Lesenswert?

Erstmal der Quelltext um den es geht:
1
typedef enum 
2
{
3
    E1,
4
    E2,
5
    E3,
6
    E4
7
} TIMER_ID;
8
9
#define TIMER_COUNT    4u    //Anzahl der im enum definierten Timer
10
11
static volatile uint16 Timers[TIMER_COUNT] = {65535, 65535, 65535, 65535};

Kann man alle Felder eines Arrays mit dem selben Wert vorbelegen lassen 
ohne dafür eine funktion schreiben und aufrufen zu müssen? (vielleicht 
mit precompiler direktiven?)

Kann man so eine art #define in der steht wieviel elemente sich in einem 
enum befinden automatisch erstellen lassen?

von Michael K. (mmike)


Lesenswert?

Hi,

zur ersten Frage kann ich leider nix sagen, aber das für die Anzahl der 
Elemente des typedefs geht folgendes:

typedef enum
{
    E1,
    E2,
    E3,
    E4,
    NUMBER_OF_TIMER_IDs
} TIMER_ID;

Vorraussetzung ist jedoch dass der erste Eintrag bei null beginnt ...

Grüße,
Michael

von Andreas B. (Gast)


Lesenswert?

In C gibt es nichts direkt, aber in GCC eine Erweiterung:
1
 To initialize a range of elements to the same value, write `[FIRST ...
2
LAST] = VALUE'.  This is a GNU extension.  For example,
3
4
     int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
(Kapitel "Designated Initializers")

Aber auch da nichts, um alle Felder zu belegen. Man muss explizit die 
Index-Bereiche angeben.

von SF (Gast)


Lesenswert?

1
typedef enum 
2
{
3
    E1 = 0, // für die Ängstlichen ...
4
    E2,
5
    E3,
6
    E4,
7
    TIMER_COUNT
8
} TIMER_ID;
9
10
static volatile uint16_t Timers[TIMER_COUNT] = {
11
    [0 ... TIMER_COUNT-1] = 65535,
12
};
So könnte das im GCC, dank seiner Erweiterungen, funktionieren. Der GCC 
akzeptiert auch berechnete Konstanten bei den Bereichsangaben. Beim 
WinAvr funktioniert bei mir so etwas ähnliches zumindest bei Daten im 
Eeprom.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.