2016-08-21 11 views
0

私のオフライン署名検証プロジェクトでは、位相特性としてオイラー数を使用しています。GOTOステートメントの実装

私はこのlink通過し、私はそこに擬似コードを発見し、私のC#の実装は以下の通りである:それはlabelAlabelBが範囲を超えていると言う

public void eulers(bool[][] t) 
{ 
    int w2 = 0; 
    int wc = 0; 
    int eulers_number = 0; 
    int x = 2; 
    int y = 2; 

    while (y <= t.Length) 
    { 
     while (x <= t.Length) 
     { 
      bool p1 = t[x][y]; 
      bool p2 = t[x - 1][y]; 
      bool p3 = t[x][y - 1]; 
      bool p4 = t[x - 1][y - 1]; 
      if (p4 == true) 
      { 
       x++; 
      } 
      else if (p2 == false) 
      { 
      labelA: 
       if (p3 == true) 
       { 
        x = x + 2; 
       } 
       else if (p1 == false) 
       { 
        x++; 
        if (x <= t.Length) 
        { 
         goto labelA; 
         break; 
        } 
       } 
       else 
       { 
        w2++; 
        x++; 
        if (x <= t.Length) 
        { 
         goto labelB; 
         break; 
        } 

       } 
      } 
      else 
      { 
      labelB: 
       if (p3 == true) 
       { 
        wc++; 
        x = x + 2; 
       } 
       else if (p1 == false) 
       { 
        x++; 
        if (x <= t.Length) 
        { 
         goto labelA; 
         break; 
        } 
       } 
       else 
       { 
        x++; 
        if (x <= t.Length) 
        { 
         goto labelB; 
         break; 
        } 
       } 
      } 
     } 
     eulers_number = w2 - wc; 
     MessageBox.Show(eulers_number.ToString()); 
    } 

コンパイル中。私はそのスタイルで使用することは不可能であることを知っているので、コードを修正しようとしましたが、私はここで立ち往生しています。このコードを動作させるにはどうすればよいですか?ここで

+0

C#では、あなたが見つけたような無関係なブロックを入力することはできません。どうしても 'goto'文にまったく依存しない別の例に基づいて実装するのはなぜですか?確かにあなたが見つけたリンクは、インターネット上の唯一の場所ではありません。あなたが見た他のバージョンは何ですか? –

+0

私は1つのアルゴリズムを見つけましたが、それは機能しません。これは私が設立したが実装することができない最高のアルゴリズムです。私はインターネット上で他のソリューションを探していますが、主な問題はプロジェクトを完了するための時間が限られていることです。 – ascc

+1

短い答え - C#でGOTOを使わないでください。それはコードを理解しにくくする。なぜ、各ラベルの下のセクションをメソッドに抽出してみてください。変更しようとしている変数をクラスレベルに移動する必要があります。 –

答えて

0

が、私は紙の擬似コードを変換するあなたの試みの作業バージョンであると信じるものです:goto文を扱うという点では

static int eulers(bool[,] pixel) 
{ 
    int w2 = 0; 
    int wc = 0; 
    int x = 1; 
    int y = 1; 
    int M = pixel.GetLength(0), N = pixel.GetLength(1); 

    while (y < N) 
    { 
     while (x < M) 
     { 
      if (pixel[x - 1, y - 1]) 
      { 
       x++; 
      } 
      else 
      { 
       bool labelA = !pixel[x - 1, y]; 

       while (true) 
       { 
        if (pixel[x, y - 1]) 
        { 
         if (!labelA) 
         { 
          wc++; 
         } 
         x = x + 2; 
        } 
        else if (!pixel[x, y]) 
        { 
         x++; 
         if (x < N) 
         { 
          labelA = true; 
          continue; 
         } 
        } 
        else 
        { 
         if (labelA) 
         { 
          w2++; 
         } 
         x++; 
         if (x < N) 
         { 
          labelA = false; 
          continue; 
         } 
        } 
        break; 
       } 
      } 
     } 

     y++; 
    } 

    return w2 - wc; 
} 

、私は(小さなステートマシンを作ることによって、それらを削除しました単一のトグル状態(labelA変数で表される)を使用し、実行フローがブロックの先頭に戻るようにループを使用してwhileループを使用します。このステップの重要な部分は、wcw2の変数が効果的にそうでなければ単なるループであるかどうかについての更新が行われたかどうかの違いだけで、labelA:labelB:のコードブロックがほぼ同一であることを認識していました。

次に、前記すなわち、コードがそれに他のいくつかの重大な欠陥を有していた:

  • 擬似コードは、ピクセルは、それぞれ、xy値に対して1からMまで1 Nまでの範囲の座標値を前提と包括的にしかし、C#配列は0ベースなので、xyの値はそれに応じて調整する必要があります。彼らは2の代わりに1から始める必要があり、MとNに達することを許される必要はなく、むしろそれらの値よりも小さく制限される必要があります。
  • コードには"jagged array"が使用されています。これは、Y座標の実際の境界を正しく決定できず、代わりにt[x].Lengthの代わりにt.Lengthを使用したX座標と同じ値を使用している点を除いて、本質的に間違っているわけではありません。このタイプのアルゴリズムでは、ギザギザの配列は非効率で扱いにくいので、先に進んで2次元配列に変更しました。
  • コードでは、現在のxy値の4つのピクセルの値をローカル変数に格納しました。ただし、xの値を変更した後でこれらの値を更新できませんでした。したがって、gotoで実装されたループのその後の反復では、間違ったピクセル値が使用されます。ローカル変数を削除し、現在のxyの値を使用して、必要に応じて直接ピクセル値を取得するようにコードを変更しました。実際、コードのこのバージョンでは、各特定のピクセルは、コード内に1つの場所しかありませんので、値を格納するのが正しい場合であっても、ローカル変数は何も追加しませんでした。
  • yの値を内部ループから離した後に増やすことができませんでした。
私もちょうど直接 bool式の値を使用して、とする方法を変更する代わりに、あなたの bool比較を削除する、(あなたが goto文の後にそれらを持っていた)余分 break文を削除し、コードを少しクリーンアップ

それを表示しようとするのではなく、最終的な値を返してください(呼び出し元はそのような&hellipを行うことができますが、このような数学的ヘルパー関数はユーザーのやりとりを提供するべきではありません)。

あなたのサンプルデータと予想される出力がないため、翻訳が正しいことを確認する方法がありませんでした。私が保証できるのは、このバージョンがあなたが始めたよりも正しい翻訳に近いことです。もちろん、コンパイル可能なC#コードも有効です。 :)

関連する問題