2011-10-20 8 views
2

私はこの質問に対して馬鹿だと感じますが、なぜこのIndexOutOfRangeExceptionが起きているのか理解できません。なぜこのint配列がIndexOutOfRangeExceptionをスローしますか?

public int[, ,] FindTablePairings(System.Text.RegularExpressions.MatchCollection mcBegin, System.Text.RegularExpressions.MatchCollection mcEnd) 
    { 
     int[,,] intTablePairs = new int[mcBegin.Count, 1, 1]; 
     int[] intBegin = new int[mcBegin.Count]; 
     int[] intEnd = new int[mcBegin.Count]; 

     for (int q = 0; q < mcBegin.Count; q++) 
     { 
      intBegin[q] = mcBegin[q].Index; 
     } 
     for (int q = 0; q < mcEnd.Count; q++) 
     { 
      intEnd[q] = mcEnd[q].Index; 
     } 

     int intBeginCount = mcBegin.Count; 
     int intEndCount = mcEnd.Count; 
     int i = 0; 
     int j = 0; 
     int k = 0; 

     while (i < intBeginCount) 
     { 
      j = i; 
      while (j < intEndCount) 
      { 
       if (intBegin[i + 1] < intEnd[j]) 
       { 
        j++; 
       } 
       else 
       { 
        intTablePairs[i, 0, 0] = intBegin[i]; 
        intTablePairs[i, 1, 0] = intEnd[j]; 
        intEnd[j] = -1;       //EXCEPTION OCCURS HERE 
        break; 
       } 
      } 
      if (j == intEndCount) 
      { 
       intTablePairs[i, 0, 0] = intBegin[i]; 
       intTablePairs[i, 1, 0] = intEnd[j - 1]; 
       intEndCount--; 
      } 

      while (k < intEndCount) 
      { 
       if (intEnd[k] == -1) 
       { 
        k++; 
       } 
       else 
       { 
        intTablePairs[i,0,0] = intBegin[i]; 
        intTablePairs[i,1,0] = intEnd[k]; 
        intEnd[k] = -1; 
        k=0; 
        break; 
       } 
      } 
     } 

     return intTablePairs; 
    } 

コードはただ見ている:エラーがスローされている場所については、以下のコードを確認してください(私が意味する、私はそれが起こっているWHYを知って、私はちょうど私のコードについて無効であるかわかりません)開始タグと終了タグの出現の文字インデックス。複雑なものはありませんが、最悪の場合はintEnd[j] = -1;に例外がスローされ、そのステートメントが実行される前にデバッガでintEnd[]を含むすべての配列とMatchCollectionが適切に初期化され、配列が存在し、初期化されていることを確認するためにデバッグしました。また、ソリューションをクリーンアップして再構築しました。

ここには何が起こっているのかについてのご意見はありますか?

答えて

5

私はエラーがここでの問題は、あなたがintTablePairsの両方のことが1に、最後の2次元の長さを定義したということである。このラインで実際に

intTablePairs[i, 1, 0] = intEnd[j]; 

であると考えています。インデックス1の使用は長さに等しいので無効です。あなたは私がintEndmcEnd.Count容量で設定されるべきであると仮定し

int[,,] intTablePairs = new int[mcBegin.Count, 2, 2]; 
+0

intEnd [j] = -1行でエラーが発生したようです。 –

+1

@ AS-CIIはエラーではありませんが、それ以外の場合は直上の行もエラーになります。どちらも 'intEnd [j]'にアクセスします。 – JaredPar

+0

私はあなたのソリューションが間違って書いていない;)彼はStackOverflowに自分のコードをコピーして間違っていたと思った。 –

0

多分これを見て:

int[] intEnd = new int[mcBegin.Count]; 

はmcEndにmcBeginを交換し、それを試してみてください。

0

として境界を定義することを意味ように思えます。だから、代わりに:

int[] intEnd = new int[mcBegin.Count]; 

あなたが持っている必要があります。

int[] intEnd = new int[mcEnd.Count]; 

はそれがお役に立てば幸いです。

関連する問題