2011-07-25 7 views
0

私はCDT、MinGW、GDBでEclipseを使ってCで研究プロジェクトを進めています。デバッガでエラーを再現できません

私は0から3までの要素を持つint配列を持っています。私は配列を繰り返して、番号を入れ替えています。私は、どこかで私の境界を覗き見せずに数字を混乱させた場合には、私のデフォルトのケースでアサート(0)を張りました。罰金 - 私はどこかでうんざりして、範囲外の数が息を呑んでいます。それは私が扱うことができるものです。問題は、デバッガでプログラムを実行すると、すべて正常に動作することです。アサーションは決して発動せず、結果は正しいものとなり、問題はありません。私は、デバッグ中にエラーを再現することができないという事実よりもエラーがあるという事実をあまり心配していません。

ここに関連コードがあります。すべての%3 = 0のint * zeroPairsの要素は、0と3の間にあります。次の2つの要素は、異なる配列へのインデックスであり、さまざまな数にすることができます。 j * 3はゼロペアの範囲外に出ることはありません。配列A、B、CおよびDは、各インデックスに1または-1しか含まれていません。私は典型的なA = temp、A = Bなどのスワップがあったときにうまくいきました。私が単純化したときに、それぞれの記号を変更するだけで、このエラーが起きたのです。

ありがとうございます!

for (j = 0; j < bits; ++j) { 
     if (k & (1 << j)) { //Check if a bit is set, if so, swap the correct elements 
      switch (zeroPairs[j * 3]) { 
      case 0: 
       A[zeroPairs[j * 3 + 1]] = -A[zeroPairs[j * 3 + 1]]; 
       A[zeroPairs[j * 3 + 2]] = -A[zeroPairs[j * 3 + 2]]; 
       break; 
      case 1: 
       B[zeroPairs[j * 3 + 1]] = -B[zeroPairs[j * 3 + 1]]; 
       B[zeroPairs[j * 3 + 2]] = -B[zeroPairs[j * 3 + 2]]; 
       break; 
      case 2: 
       C[zeroPairs[j * 3 + 1]] = -C[zeroPairs[j * 3 + 1]]; 
       C[zeroPairs[j * 3 + 2]] = -C[zeroPairs[j * 3 + 2]]; 
       break; 
      case 3: 
       D[zeroPairs[j * 3 + 1]] = -D[zeroPairs[j * 3 + 1]]; 
       D[zeroPairs[j * 3 + 2]] = -D[zeroPairs[j * 3 + 2]]; 
       break; 
      default: 
       printf("Whoops %d", zeroPairs[j * 3]); 
       fflush(stdin); 
       assert(0); 
      } 

     } 
    } 
+0

少し詳しい情報が必要です。すべての変数が適切に初期化されていることを確認しましたか? – celavek

答えて

3

デバッグビルドは、初期化されていない変数がデフォルトに設定されているため、「正しく」動作することがよくあります。

また、範囲外の配列とポインタへのアクセスでは、要素間に余分なパディングが存在するため、他の変数を上書きしないことがよくあります。あなたはまだデバッグビルドにバグがありますが、それを理解していないかもしれません。

+0

これは私の問題のようです。変わった部分は前に働いていて、私が変えたのは私が使ったスワップ方法でした...今朝戻ってきましたが、まだそれをやっています。奇妙な。 – Joel

関連する問題