2017-02-13 4 views
-5

Ich bin ein Betriebssystem mit Cosmos machen und will goto verwenden, um die Benutzereingabe zu gehen, aber ich erhalte den FehlerC# goto Benutzereingabe

Nein ‚Input‘ solche Label im Rahmen der goto-Anweisung

'Eingabe' ist eine Variable, in die der Benutzer eingegeben hat.

Ich kann verstehen, warum das passiert, aber wie kann ich es beheben?

+7

und der cosmo-Code ?? –

+2

In C# können Sie nur eine beschriftete Anweisung ("https://msdn.microsoft.com/en-us/library/13940fs2.aspx") aufrufen. Sie können sicherlich nicht zu einer Variablen gehen (was auch immer das bedeutet). – Richard

+1

Warum genau willst du goto überhaupt verwenden? – Sayse

Antwort

1

Sie können keine Benutzervariablen als Bereichskennung für goto-Anweisung .. Sie Label-Kennung verwenden müssen innerhalb des Bereichs (Namespace), die durch „:“ ..

zum Beispiel

using System; 

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(M()); 
    } 

    static int M() 
    { 
     int dummy = 0; 
     for (int a = 0; a < 10; a++) 
     { 
      for (int y = 0; y < 10; y++) // Run until condition. 
      { 
       for (int x = 0; x < 10; x++) // Run until condition. 
       { 
        if (x == 5 && 
         y == 5) 
        { 
         goto Outer; 
        } 
       } 
       dummy++; 
      } 
     Outer: 
      continue; 
     } 
     return dummy; 
    } 
} 

Methode M enthält drei verschachtelte Schleifen. Die erste Schleife durchläuft die Zahlen [0, 9], ebenso wie die beiden inneren Schleifen. In der dritten Schleife wird jedoch eine Bedingung geprüft, die dazu führt, dass die Schleife mit dem Schlüsselwort "break" beendet wird. Für Bruch

Der Code erhöht die Dummy-Variable nach jeder Beendigung der inneren Schleife. Wenn die innere Schleife früh verlassen wird, sollte diese Variable in Ruhe gelassen werden. Mit der Anweisung goto wird sie nicht erhöht. Ergebnis: Der Wert 50 wird auf der Konsole ausgegeben. Der Int wird 10 x 5 mal erhöht. jedoch: Wenn der goto eine Pause ist, wäre das Ergebnis 10 x 10-mal, oder insgesamt 100

Hope this Hilfe .. :)

+0

Ok, sieht so aus, als würde ich es auf lange Sicht machen müssen ... –

+0

Variablen sind nicht zum Springen oder zur Bereichskennung ... es ergibt keinen Sinn. Überprüfen Sie Ihre Anforderungen und Ihre Architektur erneut ... :) – user7417866

0

ich ein Betriebssystem mit Cosmos machte

Um irgendwelche entfernt nützliche Antworten zu erhalten, denke ich, dass Sie einige Informationen über den Umfang des Betriebssystems geben müssen. Fummeln Sie nur ein wenig mit COSMOS herum oder haben Sie einen speziellen Anwendungsfall, den Sie mit einem benutzerdefinierten COSMOS-Betriebssystem bedienen möchten?

und wollen goto verwenden, um die Benutzereingabe

Besonders im letzteren Fall (Fach OS) Sie sollte klar verzichten auf GOTO, wenn Sie einen sehr guten Grund zu gehen zu tue dies (und meiner bescheidenen Meinung nach gibt es keinen wirklich guten Grund, GOTO zu benutzen). Es gibt brauchbare Alternativen zu GOTOs in modernen Programmiersprachen und Sie sollten Ihr Design, Algorithmus, was auch immer überdenken.

Um Ihre Frage zu beantworten. Hier ist ein Beispiel, das die sehr Fehlermeldung erzeugt Sie erleben

private void FirstMethod() 
{ 
    goto MyLabel; 
} 

private void SecondMethod() 
{ 
    MyLabel: 
    return; 
} 

Ich habe ein Label in Method definiert. Wie auch immer, von Main kann man nicht einfach von main zu einer anderen Methode springen, da der Compiler nach Beendigung der Methode nicht wissen würde, wohin er zurückkehren soll, da keine Daten auf GOTO zum Aufruf-Stack übertragen worden wären (siehe the Wikipedia page about the call stack) Information).

Die folgende, wie auch immer, funktionieren würde, da das Etikett und die GOTO im gleichen Umfang leben

void MyMethod() 
{ 
    goto MyLabel; 
    // do something 
    MyLabel: 
    return; 
}