So blöd wie´s klingt ... switch wird nicht akzeptiert...



  • 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