0

さて、私は今、単純な 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] の後にクラッシュします。

4

1 に答える 1

1

最初の例ではinakos[5][7]、インデックスの範囲が0から4および0から6 inakos[5][0]であると宣言したため、inakos[5][1]クラッシュする可能性があります。

2番目の例では、もう一度宣言しinakos[5][7]ますが、最初のインデックスを0から6までループさせます。これinakos[i][j]もクラッシュする可能性があります。1つの修正は、インデックスを切り替えることです(つまり、とに変更しますi<adabo.getWidth()j<adabo.getHeight()

于 2013-03-02T15:18:27.267 に答える