FEHLER: Label "foo" verwendet, aber nicht definiert
Also ich wurde herumalbern mit C++ und habe die zuvor genannten Fehler mit dem code, der sah irgendwie aus wie diese:
#include <iostream>
using namespace std;
char foodstuffs;
void fruit()
{
cin>>foodstuffs;
switch(foodstuffs)
{
case 'a': goto foo; break;
case 'b': goto fooo; break;
}
}
int main()
{
cout<<"What do you want to eat? (a/b)";
fruit();
foo: cout<<"You eat an apple.";
fooo: cout<<"You eat a banana.";
}
Den genauen code war viel komplexer, aber dies ist nur zu zeigen, dass Sie die Fehler, die ich bekam.
Nun merke ich, dass jeder verachtet die "goto" - Anweisung aus irgendeinem Grund, aber meine eigentliche code ist voll von so vielen gotos, dass ich nicht wirklich die Zeit/Geduld, zurück zu gehen und ändern Sie alle. Auch ich bin irgendwie ein Neuling, Programmierer, und ich finde gotos und labels werden sehr einfach zu bedienen.
Meine Frage ist wie kann ich vordefinieren diese Etiketten, so dass die Funktion Frucht() weiß, was Sie sind? Auch ich brauche, um dies zu tun, ohne die Etiketten aus der main-Funktion.
warum goto? wie chris schon sagte, jeder hasst Sie 😉
Der wichtigste Punkt ist, haben Sie gesehen, wie Sie den code schwer zu Lesen, Folgen Sie, verstehen und pflegen. Es gibt ein paar gültige Verwendungen, wo
goto
wohl macht code sauberer, und ich persönlich würde nicht bestrafen goto
wenn der resultierende code war sauberer, aber es ist definitiv nicht etwas zu sein, geworfen, aus einer Laune heraus.Das ist, weil Sie das nicht können. Sie müssen sich selbst helfen, indem Sie lernen, nicht zu verwenden
goto
.Wenn ich könnte, würde ich downvote alle Menschen, die statt der Beantwortung der Frage darüber streiten, ob springen oder nicht. Und damit nicht genug: auch downvote die Frage. Hallo: die Frage war nicht, ob Sie mit springen gut ist oder nicht.
InformationsquelleAutor HurricaneFist | 2013-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
goto
- Anweisung kann nur auf lokal definierte Etiketten, es kann nicht direkt auf andere Funktionen.So dass die Etiketten in
main
wird nicht verwiesen werden, und diegoto
Aussagen infruit
wird nicht die Etiketten.springen Sie nicht auf andere Funktionen. Einfach an den Punkt zurückkehren rufen.
Mein Rat ist: nicht! Wenn Sie brauchen, um zu springen zwischen Funktionen, die Ihr design ist wahrscheinlich fehlerhaft. Stattdessen
return
aus der Funktion mit einem speziellen Wert, dann verwenden Sieif
oderswitch
auf, dass der zurückgegebene Wert im Aufrufer zu tun verschiedene Dinge. Mitgoto
kann nützlich sein, in einige sehr begrenzt Situationen, aber für die meisten Anwendungen gibt es immer andere und bessere Lösungen.InformationsquelleAutor Some programmer dude
Was Sie versuchen zu tun - springen zwischen den Funktionen - ist nicht gültig für eine ganze Reihe von Gründen, nicht zuletzt als Objekt Gültigkeitsbereich und Lebensdauer, die Sie berücksichtigen sollten:
Springen, um von foobar foo ist illegal, weil "Nachricht" wird nicht existieren.
So dass die Sprache einfach nicht lassen Sie dies tun.
Weiter, die Art, wie Sie versuchen, zu verwenden "springen" würde verhindern, dass Sie erneut mit der "Frucht ()" - Funktion, denn es macht immer eine Entscheidung darüber, was zu tun ist mit der Auswahl eher über die Funktion aufrufen. Was, wenn Sie wollte, dies zu tun:
Was Sie EIGENTLICH tun möchten, verwenden Sie "Frucht()" eine Funktion, die einen Wert zurückgibt.
InformationsquelleAutor kfsone
Sorry. Sie können nicht
goto
um eine Bezeichnung, die außerhalb der aktuellen Funktion ausführen. Es gibt auch andere Grenzen, über die die Verwendung vongoto
. Zum Beispiel, Sie können nicht überspringen Sie eine variable definitiongoto
. Und es gibt andere, ich bin nicht voll und ganz bewusst.Dem Strich?
Nicht verwenden
goto
.Die Frage war nicht, ob es oder nicht aber WIE.
InformationsquelleAutor Mark Garcia
goto
kann nicht verwendet werden, um zu navigieren, die außerhalb der aktuellen Funktion. Versuchen Sie, Rückkehr etwas von der Funktion und Nutzung, die in if -, else-Bedingung.InformationsquelleAutor navneet35371