Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Mehrere Aufzählungstypen

Sovebämse / 6 Antworten / Baumansicht Nickles

Ich bin gerade dabei mir C++ anzueignen. Ich lese das Buch C++ in 21 Tagen.

Dort werden Aufzählungstypen kurz angesprochen. Es geht ja darum, dass man eigene Typen erstellen kann, womit dann Variablen definiert werden können.
Als Beispiel werden die Wochentage aufgeführt. Unter anderem kann man dann die Wochentage als Wort z.B. in if-Bedingungen verwenden. So kann ich also die Zahl 1 eingeben, welche dann z.B. dem Dienstag entspricht. Mit if (x = Dienstag) kann dann die Eingabe verglichen werden.

Nun meine Frage: Ich seh den Sinn darin nicht so ganz. Wenn ich nämlich mehrere verschiedene Aufzählungstypen erstelle, werden die jeweiligen Werte ja wieder ab 0 nummeriert.

Bsp.: Ich definiere den Typ Wochentag und den Typ Monat. Mache ich nun eine Abfrage und tippe die Zahl 0 ein, dann kann damit ja der Januar oder auch der Montag gemeint sein. Ein if-Vergleich würde dann bei beiden Möglichkeiten zutreffen, wäre somit also sinnlos.

Kann mir da jemand helfen, ob ich ev. einen Denkfehler mache bzw. ob man diese Aufzählungstypen einfach nicht so benutzt? Trotzdem bleibt mir schleierhaft, was ich dann mit den integer-Werten anfangen kann, wenn sie sich nicht mehr eindeutig zuordnen lassen.

Gruss und Dank
Thomas

bei Antwort benachrichtigen
mi~we Sovebämse „Mehrere Aufzählungstypen“
Optionen

Der Sinn dieser Aufzählungstypen ist ja gerade, daß du eben nicht mit den Integer-Zahlen arbeitest, sondern mit Begriffen wie Montag, Dienstag,....oder Januar, Februar.... Es geht mehr darum, ein Programm "verständlich" und "lesbar" zu halten. Wenn du irgendwo im Programm so was wie "if (x=2)..." stehen hast, dann weißt du nach 2 Monaten vielleicht nicht mehr, was die 2 an der Stelle eigentlich bedeuten sollte. Daß da 2 für Dienstag oder Februar stehen soll, ist ja nicht so ohne weiteres ersichtlich. "if (x=Dienstag)...." ist in der Hinsicht besser, denn was 'Dienstag' bedeutet, weiß selbst ein Nicht-Programmierer. ;-)

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen
Sovebämse mi~we „Der Sinn dieser Aufzählungstypen ist ja gerade, daß du eben nicht mit den...“
Optionen

Na, dann ist es nur ein wenig fraglich, warum im Buch genau ein solches Beispiel gezeigt wird, wo der Benutzer eine Zahl eingeben muss für einen Tag und dann ein if-Vergleich kommt.

Dass der Sinn ist, dass Integer-Zahlen bzw. deren Gebrauch dadurch leicht verständlich wird, ist mir klar. Aber dafür gibt's ja auch die Möglichkeit mit const eine Konstante mit klarem Namen zuzuweisen?

Vielleicht muss ich auch einfach zuerst weiter in C++ eindringen, damit mir das alles klarer wird. Ich bin unglaublich schwach in diesen Dingen, ich bin schnell überfordert, wenns ums logische Denken geht. Ich stell mich da echt doof an, obwohl ich immerhin Grundschullehrer bin ;-)

bei Antwort benachrichtigen
higgl Sovebämse „Na, dann ist es nur ein wenig fraglich, warum im Buch genau ein solches Beispiel...“
Optionen
Na, dann ist es nur ein wenig fraglich, warum im Buch genau ein solches Beispiel gezeigt wird, wo der Benutzer eine Zahl eingeben muss für einen Tag und dann ein if-Vergleich kommt.

Darauf würde ich nicht allzuviel geben, die Autoren saugen sich die Beispiele ja auch irgendwie aus den Fingern. Dass da auch mal ein weniger Geglücktes dabei ist, passiert schon mal. Aber das kennst du ja als Lehrer bestimmt ;-)

Enums erlauben dir prinzipiell, eine Reihe von konstanten Variablen zu definieren, ohne zig Defines zu tätigen. Dass hier prinzipiell "Doppelnennungen" vorkommen können, liegt in der Natur der Sache. Falls das zum Problem wird, musst du das als Programmierer halt gezielt unterbinden (du kannst die Werte ja auch manuell zuweisen).
Neben der schöneren Lesbarkeit des Codes hast du weiter die Möglichkeit, den Wertebereich einer Variable einzugrenzen (d.h. du kannst einer enum-Variablen auch nur die definierten Werte zuweisen).


Never argue with an idiot. They drag you down to their level and then beat you with experience.
bei Antwort benachrichtigen
Andreas42 Sovebämse „Mehrere Aufzählungstypen“
Optionen

Hi!

Als Ergänzung zu mi~we's Antwort:

Die reinen Aufzählungstypen sind IMHO nur schlecht für direkte Eingaben zu nutzen. Das liegt schon daran, wie du selbst beschreiben hast, das man sie nicht direkt eingeben kann und man stattdessen einen Bytewert nutzen müsste, der erst über eine Typenwandlung mit einer Konstante des Aufzählungstyps verglichen werden kann (ich weiß jetzt nicht, wie streng C++ da ist, eine Typenwandlung könnte durchaus automatisch stattfinden).

Wenn die Aufzählungstypen verwendest, dann bewegst du dich auf der Grundlagenebene, quasi im ganz einfachen Bereich. Wenn du jetzt quasi eine Ebene höher wechselt und dich mit einer Programm-Oberfläche befasst (GUI), die dann in C++ mit "Leben" gefüllt werden (die GUI wird ja mehr oder weniger spachenunabhängig mit der Maus zusammengeklickt), dann ändert sich auch die Herangehensweise bei der Eingabe von fest vorgegebenen Werten.

Statt Aufzählungstypen wird man dann eine ENUM-Klasse finden, die im Prinzip das Prinzip der Aufzählungstypen weiterführt und die direkte Verwendung in der Oberfläche zulässt. Unabhängig, wie sich das bei deinem C++-Compiler nun nennt, wird man eine ENUM-Klasse nutzen können um z.B. Wochentage und Monatsnamen anzulegen und diese dann in Pulldown-Selektionsfeldern an der Oberfläche nutzen zu können. Ich hoffe dieser "Vorrausgriff" ist jetzt nicht zu "schnell" und du verstehst, was ich hier beschreibe (oder versuche zu beschreiben...).

OK,zurück zur "Basisebene". Da sind Aufzählungstypen einfach nur eine Erleichterung um numerische Konstanten für Aufzählungen lesbarer zu gestalten. Richtig nutzen lassen die sich aber nur intern im Programm. Bei Eingaben oder Ausgaben muss man immer eine Typwandlung in Bytes oder Integer durchführen. Dabei muss die Ein, oder Ausgabe aber eindeutig erfolgen.

Soll bedeuten ein Feld, dass entweder einen Tag oder einen Monat als Eingabe annimmt, ist nicht möglich: man braucht ein Feld für die Eingabe das Tages und ein weiteres Feld für den Monat (genauso würde man das dann bei einer GUI mit den ENUM-Feldern machen).

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
higgl Sovebämse „Mehrere Aufzählungstypen“
Optionen
Ich definiere den Typ Wochentag und den Typ Monat. Mache ich nun eine Abfrage und tippe die Zahl 0 ein, dann kann damit ja der Januar oder auch der Montag gemeint sein. Ein if-Vergleich würde dann bei beiden Möglichkeiten zutreffen, wäre somit also sinnlos.

Ja ne, das hängt davon ab, mit welchem Typ du deine enum-Werte vergleichst. Verwendest du einen Integer in der Abfrage, hast du recht. (Sinnlos ist das btw überhaupt nicht, sondern oft sehr nützlich).

z.B.

typedef enum Wochentag {...};
typedef enum Monat {...};

int i;
i = someFunction();
if (i == Montag) ... // ok

if (i == Februar)... // ok


Um Typsicherheit zu bewahren:


Wochentag i;
i = someFunction();
if (i == Montag) ... // passt

if (i == Februar) ... // Compiler-Fehler
Never argue with an idiot. They drag you down to their level and then beat you with experience.
bei Antwort benachrichtigen
Weeem higgl „ Ja ne, das hängt davon ab, mit welchem Typ du deine enum-Werte vergleichst....“
Optionen

Ich hab mir dazu wie folgt gedacht: http://www.nuso.bplaced.net/folderfi
Wenn du verstehst?!?
mfg
---
hatte nur 2std zeit...

bei Antwort benachrichtigen