enum addieren möglich?

Hallo,

warum kann man ein "enum" Datentyp

typedef enum {DATA, MILLIS, SECONDS} sDaten;    // Steuerzustände
sDaten state_Datensatz = DATA;

nicht inkrementieren?
Ich muss state_Datensatz immer neu zuweisen statt state_Datensatz++.
Hinter enum steckt doch auch nur eine Ziffernfolge 0, 1 und 2 wenn man sich das ausgeben lässt.

Compilermeldung vom inkrementieren lautet:

exit status 1
no match for 'operator++' (operand type is 'sDaten')

Mit welchen Datentyp arbeitet enum intern?

Hallo,

enums müssen nicht kontinuierlich sein, man kann ja sowas haben

enum Ding
{
   Eins,
   Zwei = 18,
   Drei
}

Deshalb sind arithmetische Operationen darauf standardmässig nicht erlaubt. In C++ wäre der Weg wohl normalerweise eine Klasse mit entsprechenden Operatoren.

Übrigens ist "typedef enum" eigentlich C, Arduino sollte ja C++ sein.

Mit welchen Datentyp arbeitet enum intern?

Das kann zumindest ab C++11 festgelegt werden

enum Ding : unsigned char
{

für C weiß ich es nicht genau.

Hallo,

aha, dann lasse ich das addieren mal lieber sein. Denn obwohl man getrennte enum definiert, kann man auch nicht doppelte Aufzählungen/Konstanten verwenden. In dem Bsp. ist "STOP" doppelt vorhanden. Ist verboten.

typedef enum {STOP, RUN, REPEAT, FINISH, TIMEOUT} SyncStates;    // Steuerzustände
SyncStates state_FreqSync = STOP;

typedef enum {DATA, MILLIS, SECONDS, STOP} sDaten;    // Steuerzustände
sDaten state_Datensatz = DATA;

Gut das wir drüber gesprochen haben. :slight_smile:
Danke.

Doc_Arduino:
In dem Bsp. ist "STOP" doppelt vorhanden. Ist verboten.

Darum wurden in C++11 die scoped enums eingeführt. Das hier ist erlaubt:

enum class SyncStates {STOP, RUN, REPEAT, FINISH, TIMEOUT};
enum class sDaten {DATA, MILLIS, SECONDS, STOP} ;

Man muss dann aber SyncStates::STOP oder sDaten::STOP schreiben. Jeder scoped enum ist ein eigener Typ.

Hallo,

das habe ich bisher nicht gewusst. Damit tun sich neue Möglichkeiten auf.
Danke.

Der Standard-Datentyp ist wie üblich int

Man kann schon addieren

state_Datensatz = (sData)(state_Datensatz + 1);

C enums sind frei in Integer konvertierbar (sonst ginge switch/case nicht!). Und genau das wird bei der Addition gemacht. Aber dann braucht man einen Cast damit es wieder ein enum ist

Habe ich auch schon gemacht. Aber wie gesagt ist das nicht sauber. enums sind zwar im Hintergrund Integer, aber von der Bedeutung her sollen es eben keine Zahlen sein

Hallo,

Danke auch dir. Alle Machbarkeiten werden sehr umständlich bzw. aufwändiger. Da bleibe ich dann doch lieber bei der "Textform" und weise neu zu. Bleibt für später einfacher lesbar. Finde lesbaren Code wichtiger. :slight_smile: