enum yes_or_no{};
-
ich würde gerne eine enum 'Klasse' (bin mir nicht ganz sicher ob das so heisst) so deklarieren:
enum yes_or_no { YES = 'ja', NO = 'nein', };um bei einer select() Anweisung zwischen 'ja' und 'nein' unterscheiden zu können also:
select(ch) { case YES://weitere Anweisungen case NO ://weitere Anweisungen }ch wird dann über 'cin' entweder als 'ja' oder 'nein' eingelesen.....
wenn ich das dann allerdings so compilieren will kommt die fehler meldung: 'overflow in implicit constant conversion' und mein Beispielprogramm kann nicht zwischen der Eingabe 'ja' und 'nein' unterscheiden.....
Mein Beispielprogramm:
#include <iostream> using namespace std; enum yes_or_no{YES = 'ja', NO = 'nein'}; int main() { char ch; cin >> ch; switch(ch) { case YES: cout << "Yes" << endl; case NO : cout << "No" << endl; } system("PAUSE"); }Bedanke mich bereits im voraus für Hilfe..
Mfg Jud4s
-
Nee so kannst du den Compiler nicht austricksen

enum-values kannst du nur integrale Werte zuweisen!
-
Du kannst für enum-Konstanten nur integrale Werte festlegen.
greetz, Swordfish
// zuuuu langsam.
-
hmmm, schade.... gibt es nen anderen trick wie ich zwischen 'ja' und 'nein' bzw wie ich zwischen complexeren eingaben unterscheiden kann...
das einzige was ich wüsste wär ein vergleich und diesen dann mit hilfe einer boolvariable auszudrücken, was aber einen riesigen Schwanz an If(){} nach sich ziehen würde... was den ganzen code unübersichtlich und schlecht zu debuggen macht.....
-
Davon ab ist 'nein' ein Multibyte-Zeichenliteral und kein C-String.
-
Und in den einzelnen Hochkommata, also den hier: ' kann nur ein einzelnes Zeichen stehen und das ist dann ein char

möp, ich sollte meine Systemuhr mal 11 Sekunden vorstellen

-
Badestrand schrieb:
Und in den einzelnen Hochkommata kann nur ein einzelnes Zeichen stehen und das ist dann ein char
Blödsinn
-
Das ist kein "Blödsinn". '' kennzeichnet ein Zeichen. "" kennzeichnet eine Zeichenkette (in multibyte). (wenn L davor steht, widestring)
-
Stimmt schon, scheint doch Blödsinn zu sein.. Wusste ich gar nicht, aber folgendes funktioniert:
int i = '1234';. Naja, danke für die Belehrung, auch wenn du ruhig noch etwas dazu hättest schreiben können
-
Wie gesagt, Multibyte-Zeichenliteral

-
Danke an alle die mir geholfen haben... auch wenn das Problem nur z.t. gelöst wurde
-
Hallo,
schau dir std::map an, damit könnte es zum Beispiel wie folgt gehen (Achtung ungetestet):#include <iostream> #include <map> #include <string> using namespace std; int main() { map<char,string> conversionMap; conversionMap['j'] = "ja"; char input; cin >> input; cout << conversionMap[input] << endl; }Du solltest allerdings vorher mit find abfangen ob dein input überhaupt in der map vorhanden ist und entsprechend darauf reagieren. Statt einer map<char,string> könnte auch eine map<string,string> sinnvoll sein!
mfG
KaPtainCugelEDIT: Statt einem string in der 2. Komponente der map kannst du natürlich auch einen Funktionszeiger verwenden, wenn du komplexere Sachen machen möchtest.
-
hmm und wie kann ich das bei switch case einbauen????
-
Jud4s schrieb:
hmm und wie kann ich das bei switch case einbauen????
Die map ist dein Switch.
Du assoziierst einen Schluessel mit einer Aktion.
Das switch findet dann in der map selber statt:
map["ja"] = something; map["nein"] = something_else; //[...] map[input].do_something();
-
ahh super thx... das ist natürlich eine seehr praktische sache

könntest du aber vll bitte dennoch einen kleinen codeabschnitt schreiben... mit deklaration und einlesung der 'map' und dem auswählen verschiedener fälle... da mir nochnicht ganz klar ist womit die Map vergleicht
-
void yes() { cout<<"jaaaaaa\n"; } void no() { cout<<"neeeeiiiin\n"; } //funktionszeiger anlegen typedef void func_ptr(); int main() { map<string, func_ptr> m; //map initialisieren map["yes"] = yes; map["no"] = no; //eingabe string input; cin>>input; //switch: if(m.find(input) == m.end()) { //ungueltige eingabe } map[input](); //funktion aufrufen }etwaige fehler vorbehalten :p
-
vielen dank ich werde es direkt mal ausprobieren^^
müsste nicht
#include <map>der Header sein???? Ich benutze den aber map ist immernoch 'undecleared'
und müsste es nicht heissen
void yes() { cout<<"jaaaaaa\n"; } void no() { cout<<"neeeeiiiin\n"; } //funktionszeiger anlegen typedef void func_ptr() name; //€ by Jud4s:hier habe ich noch n namen für den typedef eingefügt int main() { map<string, func_ptr> m; //map initialisieren map["yes"] = yes; map["no"] = no; //eingabe string input; cin>>input; //switch: if(m.find(input) == m.end()) { //€ by Jud4s:was bewirkt diese Zeile?? m.end???? //ungueltige eingabe } map[input](); //funktion aufrufen //€ by Jud4s:warum hier map[input]()<-- warum die klammern....?? }Wo in diesem Code wird eigtl der Vergleich von 'Yes'bzw 'No' gemacht??
Ich habe noch leider keine wirklichen erfahrungen mit map.....
-
wobei man sich den rückgabewert von find merken sollte und darüber aufrufen sollte sonst muss zwei mal gesucht werden
-
Jud4s schrieb:
vielen dank ich werde es direkt mal ausprobieren^^
müsste nicht
#include <map>der Header sein???? Ich benutze den aber map ist immernoch 'undecleared'
using namespace std;
oder
std::map<a, b>
-
Jud4s schrieb:
müsste nicht
#include <map>der Header sein???? Ich benutze den aber map ist immernoch 'undecleared'
das ist der Header ja, und man verwendet ihn via
std::map<KeyType, ValueType>Da sich map im Namensraum std befindet.
Alternative _kann_ man zwarusing namespace std;verwenden, aber es ist generell eine schlechte angewohnheit, die man später bei größeren projekten zu spüren bekommen kann. Und dann nur mit verdammt viel Aufwand behoben werden kann.
Jud4s schrieb:
und müsste es nicht heissen
void yes() { cout<<"jaaaaaa\n"; } void no() { cout<<"neeeeiiiin\n"; }keine ahnung was du meinst
Jud4s schrieb:
//funktionszeiger anlegen typedef void func_ptr() name; //€ by Jud4s:hier habe ich noch n namen für den typedef eingefügtDas mit dem Namen ist humbug, der name für das typedef ist "func_ptr" auch wenn es eventuell für einen anfänger nicht ganz offensichtlich ist.
Jud4s schrieb:
int main() { map<string, func_ptr> m; //map initialisieren map["yes"] = yes; map["no"] = no; //eingabe string input; cin>>input; //switch: if(m.find(input) == m.end()) { //€ by Jud4s:was bewirkt diese Zeile?? m.end???? //ungueltige eingabe }Das überprüft ob die eingabe input uns bekannt ist oder nicht, da kannst du dann eine Fehlerbehandlung einbauen.
Jud4s schrieb:
map[input](); //funktion aufrufen //€ by Jud4s:warum hier map[input]()<-- warum die klammern....??Weil du die funktion so aufrufst, du speicherst ja zeiger auf die funktionen in dem container. Und mit den klammern rufst du die funktion auf die hinter dem zeiger liegt.
Jud4s schrieb:
}[/cpp]
Wo in diesem Code wird eigtl der Vergleich von 'Yes'bzw 'No' gemacht??
Ich habe noch leider keine wirklichen erfahrungen mit map.....Wenn du map[input] aufrufst sucht er den passenden eintrag raus und gibt dann den Wert zurück der dahinter steht, falls input unbekannt ist würde er entweder einen neuen eintrag erstellen oder wenn das objekt const ist würde er eine Ausnahme schmeißen.
Ich denke die genaue funktionsweise, also was dahinter genau statt findet ist noch etwas zu weit für deinen momentanen Wissenstand. Ich empfehle dir ein buch wie z.B. C++ Primer | ISBN: 9783827326126 zu lesen das viele deiner fragen auch behandlen kann und für Einsteiger bestens geeignet ist.
Natürlich kannst du weitere fragen gerne hier im Forum stellen

BR
Vinzenz
-
vielen dank, ich gucke mal in der Bibloiothek danach.....