さて、私は今、単純な 2D マトリックス クラスを実装しようとしています。これまでのところ、次のように表示されます。
template <typename Type>
class dyMatrix {
private:
Type *mat;
int width, height;
int length;
public:
dyMatrix (int _width, int _height)
: width(_width), height(_height), mat(0)
{
length = width * height;
mat = new Type[length];
};
// ---
int getWidth() {
return width;
};
int getHeight() {
return height;
};
int getLength() {
return length;
}
// ---
Type& operator() (int i, int j) {
return mat[j * width + i];
};
Type& operator() (int i) {
return mat[i];
};
// ---
~dyMatrix() {
delete[] mat;
};
};
それをテストし、静的な多次元配列と比較するために、次のコード スニペットを作成しました。
#include <iostream>
using namespace std;
/* matrix class goes here */
struct Coord {
int x, y;
Coord()
: x(0), y(0)
{};
Coord (int _x, int _y)
: x(_x), y(_y)
{};
void print() {
cout << x << ", " << y;
};
};
int main() {
dyMatrix<Coord> adabo(5, 7);
Coord inakos[5][7];
int i = 5, j = 0;
adabo(i, j) = *(new Coord(i, j));
inakos[i][j] = *(new Coord(i, j));
inakos[i][j].print();
adabo(i, j).print();
return 0;
}
「アダボ」と「イナコス」は勝手につけた名前です。実行時にその内容を出力しますが、プログラムは何かを行うinakos
前にクラッシュします。adabo
もう 1 つの興味深い点は、それぞれ 5 と 1 のように、5 と 0 以外の値を指定するi
と、正常に動作することです。j
正確な数値がどのように機能し、何がプログラムを混乱させるのかはわかりません。ここに不規則性があることだけはわかっています。私は間違っている可能性がありますか?私は C++ のアマチュアなので、いずれかの構造で何かを誤用した可能性があります。
誰かにも時間があれば、マトリックスクラスに他に注意すべきエラーがあるかどうかを知りたいです。問題に関連していない可能性がありますが、それでも誤謬です。
inakos
次の main() でもテストしましたが、[5][1] に内容を出力した後でもクラッシュします。dyMatrix ではなく、緩やかに実装された Coord に関係しているのかもしれません。
int main() {
dyMatrix<Coord> adabo(5, 7);
Coord inakos[5][7];
for (int i = 0; i < adabo.getHeight(); i++) {
for (int j = 0; j < adabo.getWidth(); j++) {
adabo(i, j) = *(new Coord(i, j));
inakos[i][j] = *(new Coord(i, j));
inakos[i][j].print();
cout << "; ";
}
cout << "\n\n";
}
cout << "\n\n\n";
Coord temp;
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 5; j++) {
temp = adabo(i, j);
temp.print();
cout << "; ";
}
cout << "\n\n";
}
return 0;
}
編集: Coord とは関係ありません。int の dyMatrix と int の静的マトリックスでテストしたところ、[5][0] の後にクラッシュします。