2012-03-26 7 views
1

私はバイナリ行列を扱っています。 2つの配列が重なっています。 (私はアドレスを調べました)。これは行列のサイズが小さい場合にのみ起こります。したがって、私は間違った結果を得る。私は配列を割り当てるためにnewを使用しようとしましたが、私はセグメント化の失敗を取得します。私はメモリの重複を避ける方法はありますか?私はg ++コンパイラを使用しています。2つの配列のメモリアドレスの重複

これは私が、私はそれらのすべてを初期化する次のステップでは配列に

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

を宣言した方法です。 AとBはオペランドで、Cは結果を保持します。

私は次の段階でカスタム乗法アルゴリズムを使用しています。ここに私の観察TabCを1として

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 

スニペットが重なっているのです。私はそれらを印刷してメモリアドレスを調べました。ループの第2レベル(n = 9、m = 3、サイズ= 9、cnm = 3)の6番目の反復でオーバーラップします。その間にCを使用していないので、私は外側のループでのみ使用します。

+6

私たちにいくつかのコードを見せてください。メモリのオーバーラップは発生しません。 –

+0

@LuchianGrigoreスニペットを追加しました。 – nouveau

答えて

5

Cコンパイラーは重複配列を(あなたに教えてくれないか、実際にはバグがある)除いてはいけません。

ほとんどの場合、そのようなエラーの理由は間違ったポインタの算術演算または間違った配列アクセスです。あなたがTab[m][..]を宣言したが、あなたは2^mの0からiを反復処理ループを得た

(ところでPOWを使用して:でも、何かがあなたのアクセスに問題があることをあなたのコードでちょうど長い3秒、私が見る、

左シフト(< <)の代わりに)を使用してください。そして、Tab[i][...]にアクセスするので、ほとんどの場合、宣言されていないインデックスのタブにアクセスします。

+0

変数mは記録されているので、かなり小さいです。このアルゴリズムは、 'C 'を割り当てるために新しいものを使用したときに正しい結果を得ています。しかし、重複はまだ他の配列で起こります!!驚いたことに、私は2 << mでpowを置き換えると、セグメンテーション違反が発生します。 – nouveau

+1

mが記録されていますか?投稿されたコードでは、m行だけのスペースしか割り当てられませんが、2^mまでの行にアクセスします。確かにmはiからのログですが、ログされた行だけが割り当てられていますが、すべてが必要です。それは間違いなく、静的配列、mallocedまたは新しい配列のような割り当ての種類とは関係ありません。割り当ての種類を切り替えるだけであれば、バグはまだ残っていますが、明白なエラー(または明確なsegfaults)の代わりに(現時点では)より良く隠れています。 – flolo

+0

それを指摘してくれてありがとう。私はそれを推測できなかった! 。エラーを修正しました:) – nouveau