Forum: Mikrocontroller und Digitale Elektronik enum in einem struct Wieso?!


von Helmut A. (Gast)


Lesenswert?

Nabend,

wieso packt man ein enum mit in eine Struktur?
1
enum eDay
2
{
3
  Montag,
4
  Dienstag,
5
  Mittwoch,
6
  Donnerstag,
7
  Freitag,
8
  Samstag,
9
  Sonntag
10
  
11
};  
12
13
struct sTime
14
{
15
  uint8_t Day;
16
  uint8_t Month;
17
  uint16_t Year;
18
  uint8_t Hour;
19
  uint8_t Min;
20
  uint8_t Sec;
21
  enum eDay wDay;
22
  uint8_t stime;
23
  
24
}; typedef struct sTime tTime;
Es kann ja nicht wie bei einer Struktur oder einem Union drauf 
zugegriffen werden, was hat das dann für einen Sinn?
Damit man evtl. weiß was für Werte man zuweisen kann?!

von Enum user (Gast)


Lesenswert?

Enum (enumeration) ist eine Aufzählung von Werten. eDay kann nur einer 
der definierten Werte zugewiesen werden (Montag bis Sonntag). Die 
Variable wDay im Struct ist vom Typ enum eDay. Da ist kein Enum im 
Struct definiert.

von MeineZweiCent (Gast)


Lesenswert?

Enum user schrieb:
> eDay kann nur einer
> der definierten Werte zugewiesen werden (Montag bis Sonntag)

Oder aber 0 bis 6 ;)

von Bernd K. (prof7bit)


Lesenswert?

Helmut A. schrieb:
> Es kann ja nicht wie bei einer Struktur oder einem Union drauf
> zugegriffen werden

Warum soll man nicht drauf zugreifen können? Selbstverständlich kann man 
da drauf ganz normal zugreifen!

Vorsicht ist allerdings geboten wenn dieses Struct auch außerhalb der 
Anwendung in binärer Form benutzbar sein sollte, z.B. wenn Du 2 libs 
zusammen linkst die mit unterschiedlichen Compilern gebaut wurden oder 
wenn Du es binär abspeicherst und woanders wieder einliest: Es ist nicht 
garantiert welche Größe das enum hat. Meist kann man zwar mit einer 
Kompileroption beeinflussen aber wenn Du sowas vor hast würd ich ein 
compile time assert auf sizeof(sTime) dahinter schreiben so daß es beim 
Kompilieren sofort kracht wenn jemand den falschen Compiler oder falsche 
Optionen benutzt.

von Helmut A. (Gast)


Lesenswert?

Wie greife Ich denn darauf zu?

von Sub-Sub (Gast)


Lesenswert?

sollte der Strukt mit dem enum in eine C++ Datei eingebunden werden muss 
man über
1
var1 = tTime::Montag;

drauf zugreifen:

von Helmut A. (Gast)


Lesenswert?

Und das Funktioniert?

von Enum user (Gast)


Lesenswert?

In c:
1
struct tTime myTime;
2
3
myTime.wDay = Sonntag;
4
5
if (myTime.wDay == Montag) {
6
  printf("I hate Mondays!\n");
7
}

von Helmut A. (Gast)


Lesenswert?

Enum user schrieb:
> In c:struct tTime myTime;
>
> myTime.wDay = Sonntag;
>
> if (myTime.wDay == Montag) {
>   printf("I hate Mondays!\n");
> }

Okay. Wenn Ich jetzt die Member von dem enum nicht immer direkt parat 
habe , kann ich nicht wie mit einer Struktur den . Operator nutzen und 
so bezwecken das die IDE mir anzeigt welche Member es gibt?

von Cyblord -. (cyblord)


Lesenswert?

Helmut A. schrieb:

> Okay. Wenn Ich jetzt die Member von dem enum nicht immer direkt parat
> habe , kann ich nicht wie mit einer Struktur den . Operator nutzen und
> so bezwecken das die IDE mir anzeigt welche Member es gibt?

Das liegt wenn dann an deiner IDE. Die IDE sollte die Member der enum 
genauso auflösen und dir anbieten, wie sonst auch.

Poste doch mal deinen tatsächlichen Code inklusive der Variablen in der 
das Struct steckt und auf welche du den Punkt Operator anwenden willst.

: Bearbeitet durch User
von Helmut A. (Gast)


Lesenswert?

Enum user schrieb:
> In c:struct tTime myTime;
>
> myTime.wDay = Sonntag;
>
> if (myTime.wDay == Montag) {
>   printf("I hate Mondays!\n");
> }

z.B

uint8_t x = myTime.wDay.Montag

So stelle Ich mir das vor..

von Walter (Gast)


Lesenswert?

Helmut A. schrieb:
> uint8_t x = myTime.wDay.Montag
>
> So stelle Ich mir das vor..

das geht nicht und ich weiß auch nicht was du damit erreichen willst

von ... (Gast)


Lesenswert?

dann wäre das enum aber ein struct. nun ist das enum aber ein enum.
Denkst du nicht, du solltest etwas rumgoogeln was die Grundlagen angeht?

von Helmut A. (Gast)


Lesenswert?

... schrieb:
> dann wäre das enum aber ein struct. nun ist das enum aber ein
> enum. Denkst du nicht, du solltest etwas rumgoogeln was die Grundlagen
> angeht?

Das war eben die Frage. Wenn Ich jetzt nicht alle Member aus dem Kopf 
weiß und nicht immer hin und her switchen muss , wäre das ein cooler 
Feature.
Sonst verstehe Ich den Sinn nicht wieso man das in einer Stuktur mit 
aufnimmt.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Helmut A. schrieb:
> Das war eben die Frage. Wenn Ich jetzt nicht alle Member aus dem Kopf
> weiß und nicht immer hin und her switchen muss , wäre das ein cooler
> Feature.

Dann musst Du eben mehrere Editorfenster nebeneinander öffnen.

> Sonst verstehe Ich den Sinn nicht wieso man das in einer Stuktur mit
> aufnimmt.

Zu Zeit, als enums erdacht wurden, gab es keine IDEs. Trotzdem fand die 
Herren Kernighan und Riechie enums ein so "cooles Feature", dass sie sie 
in den Sprachumfang von C aufnahmen.

von Irgendwer (Gast)


Lesenswert?

Helmut A. schrieb:
> uint8_t x = myTime.wDay.Montag

Die anderen Werte in der struct verwendest du dann mit "myTime.Day.31"?
Würdest du da nicht doch eher myTime.Day = 31 verwenden?

Dein enum Montag ist nur ein etwas besser lesbares synonym für "int 0", 
daher
myTime.wDay = 0 oder halt myTime.wDay = Montag

von Sebastian S. (amateur)


Lesenswert?

>Ich schätze ein wenig C-Grundlagen täte Dir gut tun.

uint8_t x = myTime.wDay.Montag ist Unsinn, da es kein: 
myTime.wDay.Montag gibt.

Es stimmt zwar, das an irgend einer Stelle 0 ... 6 vorkommen, aber die 
Konstruktion soll ja dafür sorgen, dass nur Montag bis Sonntag 
zugewiesen bzw. abgefragt werden können.

Willst Du das nicht, so musst Du auf "echte" Zahlen ausweichen.
#define Montag   0
#define Dienstag 1
usw.
#define Samstag  5
#define Sonntag  6

struct sTime
{
  uint8_t Day;
  usw.
  uint8_t wDay;
  uint8_t stime;
}; typedef struct sTime tTime;

So kannst Du
tTime.wDay = Montag;
oder
tTime.wDay = 5; // Samstag
nutzen.
Aber auch
tTime.wDay = 127;

Ich finde die Lösung mit enum sicherer und eindeutiger.
Was ich über eine Bereichseingrenzung  und das anschließende 
durchbrechen derselben denke, möchte ich hier lieber nicht ausführen.

von Rolf M. (rmagnus)


Lesenswert?

Helmut A. schrieb:
> Sonst verstehe Ich den Sinn nicht wieso man das in einer Stuktur mit
> aufnimmt.

Was hast du denn immer mit der Struktur? Enum hat den Sinn, dass man den 
möglichen Werten Namen geben kann, so ähnlich wie bool mit true und 
false, nur dass man die Namen selber bestimmen kann und es auch mehr als 
zwei sein können.
Das ist aber alles vollkommen unabhängig davon, ob der enum in einer 
Struktur ist oder nicht.

: Bearbeitet durch User
von Checker (Gast)


Lesenswert?

Man sollte dazu sagen das man überhaupt nicht im Umkehrschluss behaupten 
kann das den enums Montag bis Sonntag der Wertebereich 0 bis 6 zu Grunde 
liegen. Was der Compiler hinterlegt entscheidet er abhängig von allen 
Gegebenheiten des gesamten Codes.

von Checker (Gast)


Lesenswert?

Es macht auch keinen Sinn enums anzulegen um dann mit Zahlen zu 
hantieren. Dann müsste man sich Arrays anlegen.

von A. S. (Gast)


Lesenswert?

Checker schrieb:
> Was der Compiler hinterlegt entscheidet er abhängig von allen
> Gegebenheiten des gesamten Codes.

Quelle für die Behauptung? Also dass Dienstag nicht durch 1 
repräsentiert werden muss in C?

Zum TO:

Zuweisungen sind doch standardmäßig mit =.

Und Abfragen/auswertungen mit switch oder als Array-Index (nur wenn 
Checker sich irrt)

Und wenn Du willst, prüft lint die richtige Verwendung.

von Rolf M. (rmagnus)


Lesenswert?

Checker schrieb:
> Man sollte dazu sagen das man überhaupt nicht im Umkehrschluss behaupten
> kann das den enums Montag bis Sonntag der Wertebereich 0 bis 6 zu Grunde
> liegen. Was der Compiler hinterlegt entscheidet er abhängig von allen
> Gegebenheiten des gesamten Codes.

Nein. Er vergibt die Werte in aufsteigender Reihenfolge und beginnt 
dabei mit der 0, sofern man bei der Typdefinition nicht explizit Werte 
angibt.

von M. K. (sylaina)


Lesenswert?

Rolf M. schrieb:
> Nein. Er vergibt die Werte in aufsteigender Reihenfolge und beginnt
> dabei mit der 0, sofern man bei der Typdefinition nicht explizit Werte
> angibt.

Ich denke, genau das meinte Checker: Solange man die Typ-/Enumdefinition 
nicht kennt kann man nicht sagen ob Montag nun das Synonym für eine 1 
oder eine 7839 ist. So hatte ich Checker zumindest verstanden.
In dem gezeigten Fall ist es natürlich klar, da sieht man ja auch alles.

von A. S. (Gast)


Lesenswert?

M. K. schrieb:
> Ich denke, genau das meinte Checker: Solange man die Typ-/Enumdefinition
> nicht kennt kann man nicht sagen ob Montag nun das Synonym für eine 1
> oder eine 7839 ist. So hatte ich Checker zumindest verstanden.
> In dem gezeigten Fall ist es natürlich klar, da sieht man ja auch alles

Das ergäbe aber keinen Sinn, weil selbstverständlich ist. Das "Montag" 
oder "Dosenfleisch" in allen denkbaren C-Programmen einen festen Wert 
haben könnten, wäre absurd anzunehmen.

Ich denke, es ging Checker um das gezeigte enum (ohne Initial-Wert).

Und da ist die Wertzuordnung nun mal explizit eindeutig (beginnend bei 
0, aufsteigend).

von M. K. (sylaina)


Lesenswert?

Achim S. schrieb:
> Das ergäbe aber keinen Sinn, weil selbstverständlich ist. Das "Montag"
> oder "Dosenfleisch" in allen denkbaren C-Programmen einen festen Wert
> haben könnten, wäre absurd anzunehmen.

Ich verweise diesbezüglich nur auf den Eröffnungspost, das ist uns ja 
auch allen klar aber der TE hat dennoch ein Verständnisproblem damit ;)

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.