2017-02-13 14 views
-5

私はコスモスでOSを作り、ユーザーの入力に行くためにgotoを使用したいが、私はgoto文の範囲内でエラーにC#の後藤ユーザー入力

はありません、このようなラベル「入力」を取得していています

「入力」は、ユーザが入力した変数である。

なぜこれが起こっているのか理解できますが、どうすれば修正できますか?

+7

とコスモ・コード内で生きているので、以下、とにかく、働くだろう? –

+2

C#ではラベル付きのステートメントのみを['goto'](https://msdn.microsoft.com/en-us/library/13940fs2.aspx)できます。確かに変数に行くことはできません。 – Richard

+1

とにかく正確にgotoを使いたいのですが? – Sayse

答えて

1

することはできませんユーザー変数スコープ(名前空間)内のラベル識別子を使用する必要があります。.. goto文のスコープ識別子によってそれを示すように「:」..例えば

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; 
    } 
} 

方法M 3つのネストされたループを含みます。最初のループは、2つの内部ループと同様に、数値[0,9]を反復します。しかし、3番目のループでは、breakキーワードを使用してループを終了させる条件がチェックされます。 の場合 壊れた場合

コードは、内側ループが完了するたびにダミー変数をインクリメントします。内部ループが早期に終了する場合は、この変数をそのままにしてください。 goto文では、インクリメントされません。 結果: 値50がコンソールに出力されます。 intは10 x 5回インクリメントされます。 しかし:後藤がブレークした場合は 、結果は10×10倍、または100

・ホープ、このヘルプの合計になります.. :)私はコスモスでOSを作っています

+0

私はそれを長い道のりでやらなければならないようです。 –

+0

変数はジャンプやスコープの識別子ではありません...意味がありません。要件とアーキテクチャを再確認することを検討してください:) – user7417866

0

リモートで役に立つ回答を得るためには、OSの範囲に関する情報を提供する必要があります。あなたはCOSMOSをちょっと見て回っているだけですか、カスタムCOSMOS OSを提供したいと思う特別なケースがありますか?

、あなたがに非常に良い理由を持っていない限り、特に後者の場合(専門的なOS)であなたは明らかに、GOTOの使用を控える必要があり、ユーザの入力

に行くためにはgotoを使用したいですそうしてください(私の謙虚な意見では、GOTOを使う本当に良い理由はありません)。現代のプログラミング言語でGOTOに代わる実行可能な選択肢があります。あなたは、あなたの設計、アルゴリズムなどを再考するべきです。

質問にお答えします。あなたが経験している非常にエラーメッセージを生成する例を次に示します。Methodにラベルを定義しました。とにかく、Mainからは、GOTOの呼び出しスタックにプッシュされたデータがないため、メソッドが終了した後、コンパイラはどこに戻ってくるかわからないので、mainから別のメソッドにジャンプすることはできません(さらにthe Wikipedia page about the call stackを参照してください)情報)。

ラベルとGOTOは同じスコープ

void MyMethod() 
{ 
    goto MyLabel; 
    // do something 
    MyLabel: 
    return; 
} 
関連する問題