1

数か月前に C++ で書き始めましたが、ポインターの使用に問題があります。仕事のために書いてきたコードでは、私が書いた matrix_t クラスを使用していくつかの行列を定義しました。これらの行列へのポインタを含むベクトルを作成しました。行列にアクセスする関数にベクトルを渡します。これが私がやろうとしていることの簡単な例です:

#include <iostream>

#include "matrix_t.h"

using namespace std;

int mat_access (vector <matrix_t<int>*> &pmatrices)
{
    matrix_t<int> mat = *pmatrices[0];
    return mat.get_cell(0, 0);
    /*get_cell(r, c) returns the value at row r, column c*/
}

int main()
{
    vector <matrix_t<int>*> pmatrices(1);

    matrix_t <int> mat (1, 1, 1);
    /*mat_1(v, r, c) has r rows, c columns, and is filled with the value v*/
    pmatrices[0] = &mat;

    for (size_t i = 0; i < 5; i ++)
    {
        int k = mat_access(pmatrices);
        cout << k;
    }
}

デバッグ中に関数をステップ実行すると、関数 mat_access が初めて呼び出されたときに機能します。ただし、get_cell が 2 回目に呼び出されると (同じ行列の同じ行と列に対してであっても)、ブレークポイントがトリガーされ、無効なアドレスがアクセスされているというエラー メッセージが出力に表示されます。App Verifier を使用していますが、それが返すコール スタックの場所にソース コードがありません。ポインタのベクトルを関数に渡さず、代わりにメイン メソッドで直接アクセスすると、問題なく動作します。また、行列の代わりにベクトルを使用して同じコードを実行すると、正常に動作します。コード内の他のいくつかの場所で get_cell を使用しており、インデックスが正しいと確信しているため、これは get_cell の問題ではないと思います。matrix_t クラス内では次のようになります。

T get_cell (size_t row, size_t col) const
{   try
    {   
        if (row >= n_rows || col >= n_cols)
            throw myerror("Index out of bounds");
    }
    catch (exception &e)
    {
        cout << "Exception: " << e.what() << '\n';
    }
    return t_array [col * n_rows + row];
}

t_array には行列要素が含まれ、n_rows は行列の行数です。他のすべてが失敗した場合は、マトリックスを 1 つのマトリックスに結合して関数に渡しますが、これが機能しない理由を理解したいと思います。任意の入力をいただければ幸いです。

4

1 に答える 1

0

構文的には、コードに問題はありません。このスニペット (上記のものと同等) を実行してみて、同じエラーが発生するかどうかを確認してください。そうでない場合は、マトリックス コードに問題がある可能性があります。

int foo(vector<int*> &v) {
    int x = *v[0];
    return x;
}

int main() {
    vector<int*> v(1);
    int x = 9;
    v[0] = &x;
    for(int i = 0; i < 5; ++i) {
        int y = foo(v);
        cout << y << endl;
    }

    return 0;
}
于 2013-02-21T00:48:31.233 に答える