Nabend,
wieso packt man ein enum mit in eine Struktur?
1
enumeDay
2
{
3
Montag,
4
Dienstag,
5
Mittwoch,
6
Donnerstag,
7
Freitag,
8
Samstag,
9
Sonntag
10
11
};
12
13
structsTime
14
{
15
uint8_tDay;
16
uint8_tMonth;
17
uint16_tYear;
18
uint8_tHour;
19
uint8_tMin;
20
uint8_tSec;
21
enumeDaywDay;
22
uint8_tstime;
23
24
};typedefstructsTimetTime;
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?!
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.
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.
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?
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.
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..
... 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.
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.
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
>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.
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.
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.
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.
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.
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.
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).
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 ;)