2012-04-25 5 views
1

現在、2つの行列の距離の二乗和を求めています。データはdouble *配列で保持されています。最初のものは同じままで、もう一方は2つのインデックスの間に32x32の配列を返す関数を使用して循環します。double *配列宣言時のヒープエラーの破損

double* Matrix::ssd(int i, int j, Matrix& rhs){ 
double sum = 0, val = 0; int g = 0, h=0; 
double* bestMatch = new double[32*32]; double* sameTile = new double[32*32]; double* changeTile = new double[32*32]; 

for(int x = i-32; x <i; x++){ 
    for(int y = j-32; y <j; y++){ 
     sameTile[g*32+h] = data[x*N+y]; 
     h++; 
    }g++; h = 0; 
} 

system("pause"); 

for(int d = 32; d<=512; d+=32){ 
    for(int e = 32; e<=512; e+=32){ 

     changeTile = rhs.getTile(d,e); 

     for(int out = 0; out < 32; out++){ 
      for(int in = 0; in < 32; in++){ 
       val = sameTile[out*32+in] - changeTile[out*32+in]; 
       val = val*val; 
       sum = sum + val; 

      }  
     } 
     cout << sum << endl; 

     sum = 0; val = 0; 

     system("pause"); 
    } 
} 

getTileを(int型I、int型J)機能:私がしようと呼び出したとき

はしかし "getTileは(D、E)" "E" の最初のインクリメントした後、それは、ヒープ破損の例外がスローされます:

double* Matrix::getTile(int i, int j){ 
double* tile = new double[32*32]; int g = 0; int h = 0; 
for(int x=i-32; x<i; x++){ 
    for(int y=j-32; y<j; y++){ 
     tile[g*32+h] = data[x*N+y]; 
     h++; 
    } 
    cout << endl; 
    g++; 
} 
return tile; 
} 

私はエラーがchangeTile double *のメモリの割り当てで発生すると思いますか?

ご協力いただければ幸いです。

+1

Nとは何ですか?また、ssd()メソッドの入力iとjは何ですか?データ[]の定義/サイズも同様に役立ちます。 – uesp

+2

'tile 'は、データが書き込まれていない状態で' getTile() 'から' return'されているようです。これは意図的ですか? – sarnold

+2

あなたのコードは、 'double * tile = new double [32 * 32]のようにそれらを絞ろうとするよりは、1行に1つのステートメントを貼り付けるだけで、はるかに読みやすくなります。 int g = 0; int h = 0; 'しかし、これらの' new double [32 * 32]は 'delete'dのどこにありますか?スマートポインタや 'std ::'コンテナのどれかを考えましたか? ** 'double *'は "配列"ではありません**、それらはポインタであり、そのように扱われるべきです。 – Johnsyweb

答えて

3

あなたのコードには、配列要素への不適切なアクセスに関連する問題がたくさんあります。最初のループでは

ライン:非常に少なくとも

sameTile[g*32+h] = data[x*N+y]; 

はデータ配列をアンダフロー。 i = 0、j = 0、N = 512の場合、ループの最初のパスでデータ[-16416]にアクセスしようとしています。

2番目の問題は、内側のループの最後でhを0にリセットすることを忘れたgetTile()メソッドです(ssd()メソッドの場合のように)。

changeTile = rhs.getTile(d, e); 

及び方法getTile()アレイオーバーフローがデータ[]に発生しない保証するために、これは私も行をダブルチェックする[]

タイルのオーバーフローが生じます。

全体的には、可能な限り、適切なstd :: containersを使用することをお勧めします。それらを正しく使用すると、このタイプのエラーを完全になくすことができます。生のポインタ/配列を実際に使用する必要がある場合は、必要に応じて境界を確認するだけでなく、できる限りインデックスを作成する必要があります。

+0

ちょっと@uesp、応答のおかげで。コードの無駄な部分を言い訳しなければならないでしょう。その多くは精製が必要であり、実際に動作するプログラムを手に入れるだけです。あなたが言及した最初のループは私にいくつかの問題を救った、私は入った値が決して32よりも低くならないと仮定していた。 問題は確かにchangeTile = rhs.getTile(d、e); 返されるデータが正しい場所にないため、32番目のインデックス値ごとに各要素が入力されているようです。 再度お返事ありがとうございます:> – Marobri

関連する問題