現在、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 *のメモリの割り当てで発生すると思いますか?
ご協力いただければ幸いです。
Nとは何ですか?また、ssd()メソッドの入力iとjは何ですか?データ[]の定義/サイズも同様に役立ちます。 – uesp
'tile 'は、データが書き込まれていない状態で' getTile() 'から' return'されているようです。これは意図的ですか? – sarnold
あなたのコードは、 'double * tile = new double [32 * 32]のようにそれらを絞ろうとするよりは、1行に1つのステートメントを貼り付けるだけで、はるかに読みやすくなります。 int g = 0; int h = 0; 'しかし、これらの' new double [32 * 32]は 'delete'dのどこにありますか?スマートポインタや 'std ::'コンテナのどれかを考えましたか? ** 'double *'は "配列"ではありません**、それらはポインタであり、そのように扱われるべきです。 – Johnsyweb