2

さて、私は動的な 2 次元行列クラスを実装しています。基礎として、これは私がこれまでに持っているものです:

template <typename Type>
class dyMatrix {
    private:
        Type *mat;

        int lines, columns;
        int length;

        void assimilate (const dyMatrix<Type>& that) {
            lines = that.lines;
            columns = that.columns;

            length = that.length;
        }

    public:
        dyMatrix (int height, int width)
            : lines(height), columns(width), mat(0)
        {
            length = lines * columns;
            mat = new Type[length];
        };

        // ---

        int getLines() {
            return lines;
        };

        int getColumns() {
            return columns;
        };

        int getLength() {
            return length;
        }

        // ---

        Type& operator() (int i, int j) {
            return mat[j * columns + i];
        };

        Type& operator() (int i) {
            return mat[i];
        };

        // ---

        dyMatrix (const dyMatrix<Type>& that) {
            this->assimilate(that);

            // ---

            mat = new Type[length];

            for (int i = 0; i < length; i++) {
                mat[i] = that.mat[i];
            }
        };

        dyMatrix& operator= (const dyMatrix<Type>& that) {
            Type *local_mat = new Type[that.length];

            for (int i = 0; i < that.length; i++) {
                local_mat[i] = that.mat[i];
            }

            // ---

            this->assimilate(that);

            delete[] mat;
            mat = local_mat;

            // ----

            return *this;
        };

        ~dyMatrix() {
            delete mat;
        };
};

私の問題は、入力を読み取ろうとしたときに特定の問題が発生したことです。たとえば、次の main() があります。

int main() {
    int lanes, cols;
    cin >> lanes >> cols;

    dyMatrix<int> map(lanes, cols);

    /* CONTINUE READING */

    cout << endl;
    for (int i = 0; i < lanes; i++) {
        for (int j = 0; j < cols; j++) {
            cout << map(i, j) << ' ';
        }
        cout << endl;
    }
}

次のコード行を配置すると、コメント付きのセクションになります。

int aux;
for (int i = 0; i < lanes; i++) {
    for (int j = 0; j < cols; j++) {
        cin >> map(i, j);
    }
}

また:

int aux;
for (int i = 0; i < lanes; i++) {
    for (int j = 0; j < cols; j++) {
        cin >> aux;
        map(i, j) = aux;
    }
}

あるいは:

int aux;
for (int i = 0; i < lanes; i++) {
    for (int j = 0; j < cols; j++) {
        cin >> aux;
        map(i, j) = i + j; // !!!
    }
}

...うまくいきません。ただし、何らかの理由で、次のようになります。

int aux;
for (int i = 0; i < lanes; i++) {
    for (int j = 0; j < cols; j++) {
        // cin >> aux;
        map(i, j) = i + j; // Still the same thing as before, logically
    }
}

理解できません。ここで何が起きてるの?


編集:申し訳ありませんが、デバッグ手順を含めるのを忘れていました。

入力:

3 5
1 2 3 4 5
1 2 3 4 5

最初の行には、行列の次元があります。2 行目と 3 行目は値が書き込まれます。ただし、3 行目の最後で Enter キーを押すと、プログラムがクラッシュします。

次の入力でも機能しません。

3 5
1
2
3
4
5
1
2
3
4
5

2 番目の 5 の直後に再びクラッシュします。

4

1 に答える 1

2

あなたのインデックスは間違った方法で表示されます:

    Type& operator() (int i, int j) {
        return mat[j * columns + i];
    };

ここで、iは明らかに列でj、 は行です。ただし、ループでは、引数は逆の順序で表示されます。

for (int i = 0; i < lanes; i++) {
    for (int j = 0; j < cols; j++) {
        map(i, j) = ...; // row then column
    }
}

また、デストラクタは使用する必要があり、使用する必要はdelete[]ありませんdelete

于 2013-03-02T19:01:54.423 に答える