1

私はバイナリ行列に取り組んでいます。2つのアレイがオーバーラップしています。(アドレスを確認しました)これは、いくつかのサイズの行列でのみ発生します。したがって、間違った結果が得られます。newを使用して配列を割り当てようとしましたが、そうするとセグメンテーション違反が発生します。メモリの重複を回避する方法はありますか?私はg++コンパイラを使用しています。

これが私が配列を宣言した方法です

bool A[size0][size0],B[size0][size0],C[size0][size0];

次のステップでは、それらすべてを初期化します。AとBはオペランドであり、Cは結果を保持します。

次の段階では、カスタムの乗算アルゴリズムを使用しています。これがスニペットです

 for(I=0;I<cnm;I++){  
    bool Tab[m][size];
    bool Ctemp[size][size];

    int count=0;
    for(uint i=0;i<pow(2.0,m*1.0);i++){ 
            for(uint j=0;j<n;j++){
                    Tab[i][j]=0;  //Initialize
                    if(i==0){
                            Tab[i][j] = 0;
                    }
                    else{
                      int dec;
                      //h is calculated here
                      dec=gray_map[i-1]^gray_map[i]; //gray_map returns gray code
                      Tab[i][j] = Tab[i-1][j] ^ B[h][j];
                    }
                    ....
                    ....
              }
     }
     .....
     .....
     //Rest of the code

私の観察TabによるとC、重複しています。印刷してメモリアドレスを確認しました。これらは、2番目のレベルのforループの6回目の反復でオーバーラップします(n = 9、m = 3、size = 9、cnm = 3)。私はその間に使用していませんC、私はそれを外側のループでのみ使用します。

4

1 に答える 1

6

Cコンパイラは配列をオーバーラップさせません(あなたがそれらを教えたり、本当にバグがある場合を除いて)。

ほとんどの場合、このようなエラーの原因は、間違ったポインター演算または間違った配列アクセスです。

あなたのコードで 3 秒だけ長い場合でも、アクセスに何か問題があることがわかります。

宣言しTab[m][..]ましたが、0 から 2^m まで反復するループを取得しましたi(計算に pow を使用するのはあまり良くありません。代わりに左シフト (<<) を使用します)。そして にアクセスするTab[i][...]ので、ほとんどの場合、宣言されていないインデックスで Tab にアクセスします。

于 2012-03-26T12:25:19.790 に答える