So blöd wie´s klingt ... switch wird nicht akzeptiert...
-
Hallo und guten morgen liebe Gemeinde.
So blöd wie es klingt, bei mir wird die Anweisung
switch()
nicht akzeptiert.Folgender Programmcode:
#include<iostream> #include<cstring> #include<string> using namespace std; bool isLonger(string first, string second) { return first.size() > second.size(); } int main() { cout << "\tErste Schritte mit String\n\n"; cout << "\n"; int number_1; do { cout << "Was wollen Sie tun?\n"; cout << "(1) Texte miteinander vergleichen\n"; cout << "(2) Passwortabfrage\n"; cout << "(3) Nach Buchstaben in einem Text suchen\n"; cout << "(0) Exit\n"; cin >> number_1; switch(number_1) { case 1: string erste; cin >> erste; string zweite; cin >> zweite; if(isLonger(erste,zweite)) cout << "Der erste ist länger"; else cout << "Der zweite ist länger"; break; case 2: std::cin.ignore(1); string e; e = "Maximilian*Maximilian"; cout << "\n"; cout << "\tPasswortabfrage!\n"; cout << "\n"; do { cout << "Wie lautet das Passwort?\n"; cin >> e; if(e=="Maximilian*Maximilian") cout << "Richtig eingegeben"; else cout << "Nicht richtig eingegeben!\n"; }while(e!="Maximilian*Maximilian"); break; case 3: std::cin.ignore(2); char String[10000]; char *pString; char Buchstabe; cout << "Geben Sie einen String von weniger als 10000 Buchstaben ein!\n"; gets(String); cout << "Nach welchem Buchstaben soll gesucht werden?\n "; cin >> Buchstabe; pString = strchr(String, Buchstabe); while(pString!=NULL) { cout << "Gefunden an " << pString-String+1 << "\n"; pString = strchr(pString+1, Buchstabe); } break; case 0: cout << "Exit durch Abbruch!\n"; break; } }while(number_1!=0); return 0; }
Ich sehe den Fehler in Zeile 26 bei Gott nicht... Ich habe wirklich eine Stunde lang nach dem Fehler gesucht...
-
Wie lautet die Fehlermeldung?
-
Bashar schrieb:
Wie lautet die Fehlermeldung?
Error: Die Übertragung eines Steuerelements umgeht die Initialisierung:
-
Du darfst keine Variablendefinitionen im Scope "Überspringen". Führe einen neuen Scope ein:
switch (a) { case 1: { std::string s; // ... } case 2: { } }
Und die Fehlermeldung dazu sollte eigentlich mehr als offensichtlich sein. http://ideone.com/Rd2Tgj
-
Langsam fange ich an zu schreien...
Ich habe überall, wo
std::...
gefehlt hat, es hinzugefügt, aber esswitch
wird immer noch rot unterringelt...Edit:
Hier einmal die Fehlermeldungen, die ich sonst bekomme:
error C2360: Initialisierung von 'zweite' durch 'case'-Marke übersprungen error C2360: Initialisierung von 'erste' durch 'case'-Marke übersprungen string.cpp(61): error C2360: Initialisierung von 'e' durch 'case'-Marke übersprungen error C2360: Initialisierung von 'zweite' durch 'case'-Marke übersprungen error C2360: Initialisierung von 'erste' durch 'case'-Marke übersprungen error C2360: Initialisierung von 'zweite' durch 'case'-Marke übersprungen error C2360: Initialisierung von 'erste' durch 'case'-Marke übersprungen
-
silent_max schrieb:
Bashar schrieb:
Wie lautet die Fehlermeldung?
Error: Die Übertragung eines Steuerelements umgeht die Initialisierung:
Falls es irgendwie geht, besorg dir einen Compiler mit englischen Fehlermeldungen. Das kann man ja nicht verstehen, da es wohl von dressierten Affen übersetzt worden ist.
-
nah, du darfst nicht zuviel drum geben was deine IDE rot unterschlängelt, gib lieber was auf das, was der compiler zu meckern hat.
beispiel: ich hab gestern ein bisschen durch die endlosen defines und typedefs vom MSVC10 durchgeguckt. und mitten drin in irgendeiner (compiler internen) headerdatei war en gutes stück rot unterstrichen. bisschen komisch, aber es heisst nicht dass mein programm falsch ist und nicht funktioniert
-
silent_max schrieb:
Langsam fange ich an zu schreien...
Ich habe überall, wo
std::...
gefehlt hat, es hinzugefügt, aber esswitch
wird immer noch rot unterringelt...Es geht nicht um das std:: sondern um die geschweiften Klammern {}...
-
silent_max schrieb:
Langsam fange ich an zu schreien...
Ich auch, kannst du lesen? Oo Mit std:: hat das nichts zu tun.
-
zu Zeile 64 in deinem Quelltext:
http://www.cplusplus.com/reference/cstdio/gets/
beim Abschnitt Compatibility lesen.Hat jetzt primär nix mit deinem Problem zu tun. Ist aber, wenn der Nutzer nicht "passende Eingaben" macht, eine Fehlerquelle.
In neuen Quelltexten also
gets(String);
meiden.
-
Hier noch ein paar Anmerkungen:
#include<iostream> //#include<cstring> // raus damit #include<string> using namespace std; bool isLonger(string first, string second) { return first.size() > second.size(); } int main() { cout << "\tErste Schritte mit String\n\n"; cout << "\n"; int number_1; do { cout << "Was wollen Sie tun?\n"; cout << "(1) Texte miteinander vergleichen\n"; cout << "(2) Passwortabfrage\n"; cout << "(3) Nach Buchstaben in einem Text suchen\n"; cout << "(0) Exit\n"; cin >> number_1; switch(number_1) { case 1: { // string erste; cin >> erste; string zweite; cin >> zweite; if(isLonger(erste,zweite)) cout << "Der erste ist länger"; else cout << "Der zweite ist länger"; // wird auch bei gleicher Länge der Strings ausgegeben break; } case 2: { // std::cin.ignore(1); string e; e = "Maximilian*Maximilian"; // warum? // | cout << "\n"; // | cout << "\tPasswortabfrage!\n"; // | cout << "\n"; // | // | do // | { // | cout << "Wie lautet das Passwort?\n"; // v cin >> e; // hier wird e eingelesen (bis zum nächsten Leerzeichen) if(e=="Maximilian*Maximilian") cout << "Richtig eingegeben"; else cout << "Nicht richtig eingegeben!\n"; }while(e!="Maximilian*Maximilian"); break; } case 3: { //std::cin.ignore(2); // siehe unten //char String[10000]; // benutze std::string string String; //char *pString; // raus damit char Buchstabe; cout << "Geben Sie einen String von weniger als 10000 Buchstaben ein!\n"; // mit std::string nicht mehr auf 10000 Buchstaben begrenzt //gets(String); // benutze getline(cin, String); cin.ignore(numeric_limits<streamsize>::max(), '\n'); getline(cin, String); // liest die gesamte Zeile ein cout << "Nach welchem Buchstaben soll gesucht werden?\n "; cin >> Buchstabe; /* pString = strchr(String, Buchstabe); while(pString!=NULL) { cout << "Gefunden an " << pString-String+1 << "\n"; pString = strchr(pString+1, Buchstabe); } */ // C++ Version size_t pos = String.find(Buchstabe); while (pos != string::npos) { cout << "Gefunden an " << pos+1 << "\n"; pos = String.find(Buchstabe, pos+1); } break; } case 0: cout << "Exit durch Abbruch!\n"; break; } }while(number_1!=0); return 0; }
-
cooky451 schrieb:
Du darfst keine Variablendefinitionen im Scope "Überspringen". Führe einen neuen Scope ein:
switch (a) { case 1: { std::string s; // ... } case 2: { } }
Und die Fehlermeldung dazu sollte eigentlich mehr als offensichtlich sein. http://ideone.com/Rd2Tgj
Ok, ok, die geschweiften Klammern bei Dir habe ich jetzt total ignoriert, da ich dachte, es gehe rein um
std::...
.Weil hier habe ich einen Code, wo ich die geschweiften Klammern nicht gemacht habe und trotzdem funktioniert der Code:
#include <iostream> #include <string> using namespace std; int main() { float a; float *pa=&a; float x,y,z; float *px = &x; float *py = &y; float *pz = &z; std::string Text; string *pText = &Text; char Satz[1000]; char *pSatz = &Satz[1000]; int number_1; do { cout << "Was wollen Sie tun?\n"; cout << "(1) Rechnen ueber Pointer\n"; cout << "(2) Speicheradresse eines Strings ausgeben!\n"; cout << "(3) Speicheradresse eines char ausgeben!\n"; cout << "(4) Pointer inkrementieren und dekrementieren!\n"; cout << "(0) Abbruch!\n"; cin >> number_1; switch(number_1) { case 1: int number_2; do { cout << "Welche Operation wollen Sie ausfuehren?\n"; cout << "(1) Addition\n"; cout << "(2) Subtraktion\n"; cout << "(3) Multiplikation\n"; cout << "(4) Division\n"; cout << "(0) Abbruch!\n"; cin >> number_2; switch(number_2) { case 1: cout << "Addition!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px + *py; cout << *px << " + " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 2: cout << "Subtraktion!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px - *py; cout << *px << " - " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 3: cout << "Multiplikation!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px * *py; cout << *px << " * " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 4: cout << "Division!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px / *py; cout << *px << " / " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 0: cout << "Exit durch Abbruch!\n"; break; } }while(number_2!=0); break; case 2: std::cin.ignore(1); cout << "Geben Sie einen Text ein!\n"; getline(cin, Text); cout << "\n"; cout << "Das haben Sie eingegeben: \n"; cout << Text << "\n"; cout << "Speicheradresse des Textes:" << &Text << "\n"; cout << "\n"; break; case 3: std::cin.ignore(2); cout << "Geben Sie einen Satz ein!\n"; gets(Satz); cout << "\n"; cout << "Diesen Satz haben Sie eingegeben: \n"; cout << Satz << "\n"; cout << "Speicheradresse des Satzes: " << &Satz << "\n"; break; case 4: cout << "Geben Sie eine Zahl ein!\n"; cin >> a; cout << "\n"; cout << "Das haben Sie eingegeben: " << a << "\n"; cout << "\n"; *pa+=1; cout << "Inkrementiert: " << *pa << "\n"; cout << "\n"; *pa-=2; cout << "Dekrementiert: " << *pa << "\n"; cout << "\n"; break; case 0: cout << "Exit durch Abbruch!\n"; cout << "\n"; break; } }while(number_1!=0); return 0; }
Wo ist denn der Unterschied, dass ich beim momentan Code die geschweiften Klammern setzen muss und beim 2ten Code nicht??
Gruß
-
Aufgabe 1: Lesen lernen.
-
Beim Sprung in einen der case-Zweige wird eine Initialisierung übersprungen. (Das würde die Fehlermeldung auch aussagen, wenn sie nicht von Idioten übersetzt worden wäre, wie gesagt.)
Beispiel:
switch (x) { case 1: int y = 42; case 2: z = y; // was passiert? ...
Antwort: Nichts passiert, sowas ist nicht erlaubt. Das ist sogar nichtmal dann erlaubt, wenn y in den anderen case-Zweigen überhaupt nicht benutzt wird. Also musst du den Gültigkeitsbereich von y beschränken, indem du den case-Zweig in einen eigenen Block packst, wie bei cooky gesehen.
In deinem zweiten Beispiel gibt es keine übersprungene Initialisierung, deshalb gibt es auch kein Problem.
-
Die Fehlermeldung besagt, dass durch das "break" in Deinem switch-case Variablendefinitionen in nachfolgenden case-Anweisungen übersprungen werden, was nicht erlaubt ist. In dem zweiten Beispiel, dass Du angegeben hast, werden in cases keine Variablen definiert. Deswegen funktioniert das.
@cooky: Arbeite mal an Deinen Umgangsformen. Deine Erläuterungen sind für einen Anfänger nicht zu verstehen. Aufgabe 1: Netiquette lernen, Aufgabe 2: Zielgruppengerechte Kommunikation lernen.
-
case_breaker schrieb:
Die Fehlermeldung besagt, dass durch das "break" in Deinem switch-case Variablendefinitionen in nachfolgenden case-Anweisungen übersprungen werden, was nicht erlaubt ist.
Mit dem break hat das nichts zu tun.
-
cooky451 schrieb:
Du darfst keine Variablendefinitionen im Scope "Überspringen". Führe einen neuen Scope ein:
Darf ich an der Stelle fragen, was Du mit "Scope" meinst??
Ich habe zwar gegoogelt, habe aber Sachen wie http://ladedu.com/cpp/kapitel8_der_scope_operator bekommen.
Gruß
-
Wenn ich nach "C++ scope" suche kommen mindestens 500 gute Ergebnise, die ersten sind
http://msdn.microsoft.com/en-us/library/b7kfh662(v=vs.80).aspx
http://www.drdobbs.com/cpp/scope-regions-in-c/240002006
Kurz: Scope = Gültigkeitsbereich = { /* das hier */ }void foo() { // ein scope { // noch einer { // und noch einer! } } }
-
Ja ok...
Dann habe ich erneut etwas dazu gelernt...