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 es switch 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 es switch 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...


Anmelden zum Antworten