Variablengültigkeit



  • Hallo,

    habe mal eine Frage zur Gültigkeit von Variablen. Genauer gesagt habe ich folgende Methode in C++. Prinzip: Der übergebene String wird durchlaufen und sobald das gesuchte Zeichen gefunden wurde, wird das ganze abgebrochen und die Position des Zeichens zurückgegeben:

    string Class1::SucheZeichen(string str, char zeichen)
    {
    	result = "";
    
    	for (int i = 0; i < str.length(); i++)   
    	{
    		if (str.at(i) == zeichen)     
    		   break;                           
    	}
    
    	result = str.substr(0,i);
             return result;
    }
    

    Normalerweise dürfte dabei die Variable i ja nur innerhalb der For Schleife gültig sein. In der vorletzten Zeile dürfte ich also (nach meinem Verständnis) keinen Zugriff mehr auf das i haben und daher dürfte der Code eigentlich nicht fehlerfrei kompilieren, richtig? 😕 Ich muss dazusagen der Code ist nicht von mir, aber er lässt sich kompilieren.

    Gruß

    mtp



  • welcher kompiler?



  • Das ist leider eine Altlast die z.B. auch der MS-Visual C++ mit sich herumträgt, die sich aber zumindest in den Projekt-Settings beheben lässt:

    Properties->C/C++->Language->Force Conformance In For Loop Scope

    (Keine Ahnung wie das im deutschen heisst)

    Falls es ein anderer Compiler ist hab ich ohne mehr Infos keine Lösung parat.

    Der Code ist aber so, wie Du ganz richtig sagst, nicht standardkonform, sprich das i sollte nach der Schleife "futsch" sein und ein "guter" Compiler meckern. 😉



  • Ja, Compiler ist der MS Visual C++ 6 Compiler. Dann wird's wohl daran liegen. Thx. mtp



  • Ist jetzt ungetestet, aber Std-konform sollte das ungefähr so aussehen:

    string Class1::SucheZeichen(string str, char zeichen) {
        for (int i = 0; i < str.length(); i++) {
            if (str.at(i) == zeichen)
               return str.substr(0,i);
        }
        return "";
    }
    

    Spricht ja nichts dagegen direkt aus der Schleife zurückzukehren und so sparst Du Dir auch die temp-Variable.



  • @mantiz
    Wobei die at-methode ja nicht nötig ist, da das Range-checking ja bereits in der for-Schleife übernommen wird. Ansonsten liefert str.length kein int zurück...


Anmelden zum Antworten