Hauptschleife aus Unter,Unter,Unterschleife heraus abrechen aber wie?
-
Hallo hab folgendes Problem
ich hab eine If-Schleife die mehrere Unterschleifen (weiter if's und Switch -Schleifen)
so und ich will jetzt die Hauptschleife aus den Unterschleifen unterbrechen können geht das überhaupt oder muß man da das all gehasste Goto verwenden?Merci
MfG Felix
-
Gegen _ein_ gut gesetztes Goto ist wohl nichts einzuwenden wenn wirklich alles andere nicht funktioniert bzw. der Code dann zu unübersichtlich werden würde. Aber in den meisten Fä#llen kann man auch ohne Goto auskommen.
Vielleicht zeigst Du einfach ein wenig Code, dann kann man besser was dazu sagen.
-
Ok hier ist der Code
void __fastcall TfrmHaupt::rftAWLKeyPress(TObject *Sender, char &Key) { String STZeile,STbearbeiten; char cDummy; int hello,i; int Klammertiefe=0; int x=0; if (Key==13) { x=rftAWL->CaretPos.y; STZeile=rftAWL->Lines->Strings[x]; //liest Zeile x aus Zeile 1 ==> x=0 STbearbeiten=STZeile; if(STbearbeiten.AnsiPos("//")>0) { STbearbeiten.Delete(STZeile.AnsiPos("//"), StrLen(STZeile.c_str())- STZeile.AnsiPos("//")+1); STbearbeiten=STbearbeiten.Trim(); } cDummy=STbearbeiten[1]; //Edit1->Text=toupper('='); if (StrLen(STbearbeiten.c_str()) >= 2 && STbearbeiten[1]!='=') { switch(toupper(cDummy)) { case 'U': if (toupper(STZeile[2])!='N' & toupper(STZeile[2])!=' ') { /* rftAWL->SelStart = 1; rftAWL->SelLength = (StrLen(STbearbeiten.c_str()));*/ rftAWL->SetFocus(); rftAWL->SelStart=0; rftAWL->SelLength = (StrLen(STbearbeiten.c_str())); rftAWL->SelAttributes->Color=clRed; //hier soll die if Schleife (if (Key=13)) abgebrochen werden }hab jetzt mal bis zum Punkt wo es raus springen soll reinkopiert wenn du mehr brauchst einfach sagen dan schreib ich die ganze Funktion rein das könnte nur etwas unübersichtlich werden

MfG Felix
-
Erstmal gibt es keine if- oder switch-Schleife
Und dann könntest du Phibs' Vorschlag aufgreifen:if(...) { //... switch(c) { case 'U': //... goto endif; case 'V': //... } //... } endif: //... (weiter hinter der Abfrage)Wenn hinter dem switch() nichts mehr kommt, kannst du auch mit break; dort rausgehen - das if() wird automatisch beendet.
-
Das mit dem Goto ist natürlich die Einfachste Methode aber mein Dozent hat mir das letzte mal als ich ein Goto auch nur angedacht habe mein Testat verweigert auf den Zermon habe ich keine Lust mehr. Es sei den es geht nicht anders.
Hinter dem Switch kommt noch einiges an Code bis die if "Klammer" fertig ist insofern ist break die Falsche Lösung.
MfG Felix
-
Du könntest auch den ganzen Kram hinter dem switch() in ein if(toupper(cDummy)!='U'&&...){...} einschließen. Oder du machst aus der if() eine for()-Schleife - aus der kannst du auch mit continue rausgehen

for(bool exec=false;!exec&&Key==13;exec=true) //...(aber ehrlich gesagt gefällt mir das goto besser ;))
-
Könnte man das nicht mit einem break lösen?
if(...) { //... switch(c) { case 'U': //... if(Key==VK_RETURN) break; case 'V': //... } //... } endif:
-
Offenbar ist break nicht das, was bierber wollte - es beendet nämlich nur den switch()-Block und nicht den drumherumliegenden if()-Block.
-
GOTOs wollen mir einfach nicht gefallen. Wie wäre es mit einem return? (Ich weiß, die sollten auch nicht mitten in einer Funktion stehen.)
Ein wohlplaziertes else kann auch Wunder wirken.
-
dann könnte man ja noch eine bool Variable setzen, die nach der switch Abfrage geprüft wird und wenn sie gesetzt wurde die if-Abfrage verlassen, wenn sie nicht gesetzt wurde den Rest des Codes ausführen.
-
Joe_M. schrieb:
Ein wohlplaziertes else kann auch Wunder wirken.
Genau so wie eine wohl gewählte Partitionierung der Funktionen in Unterfunktionen... (o;