0

doubleの配列を保持するdouble*をクラスのコンストラクターに渡して、要素にvalue要素を割り当てようとしています。

主要:

int main()
{
    double* data = new double[4];
    data[0] = 1.1; data[1] = 2.2; data[2] = 3.3; data[3] = 4.4;

    Matrix a(2,2,data);

    return 0;
}

そしてこれは私のコンストラクターです:

Matrix::Matrix(int M, int N, double* input_data)
{
    this->M = M;
    this->N = N;

    cout << "Matrix Constructor: M: " << M << "\tN: " << N << endl;

    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            data[i*N+j] = input_data[i*N+j]; //***This is the problem***
        }
    }

}

コンストラクターで過去にインデックスを作成しようとするinput_data[0]と、クラッシュが発生します。正常にアクセスでき、メイン関数でdata[]過去のデータにインデックスを付けることができます。input_data[0]

私はこれがこのように行われるべきではないと仮定しており、正しい方向への微調整をいただければ幸いです。

4

5 に答える 5

3

dataコンストラクターでメモリを割り当てていないようです。

Matrix::Matrix(int M, int N, double* input_data)
{
   data = new double[M*N];
   //....
}
于 2012-03-05T21:19:17.437 に答える
1

私はそれがとして宣言されたクラスdataのメンバーであると仮定します。Matrixdouble*

コンストラクターでこのメンバーにメモリを割り当てる必要があります。

this->M = M;
this->N = N;
data = new double[M * N];
...

delete[] data;デストラクタを呼び出すことを忘れないでください。delete[] data;また、メインの最後に電話する必要があります。

于 2012-03-05T21:21:25.367 に答える
0

データを保存するためにメモリを割り当てたことはありません。

Matrix::Matrix(int M, int N, double* input_data)
{
    this->M = M;
    this->N = N;
    data = new double[N * M]; // Allocate space for N * M elements

    cout << "Matrix Constructor: M: " << M << "\tN: " << N << endl;

    for (int i = 0; i < M; i++)
     {
         for (int j = 0; j < N; j++)
         {
             data[i*N+j] = input_data[i*N+j]; //***This is the problem***
         }
     }

}

C ++では、このような動的配列を可能にするには、データがサイズの配列であることを明示的に指定する必要がありますN * M。それ以外の場合は、どこにでもある可能性のある未定義の場所に割り当てています。

于 2012-03-05T21:20:17.000 に答える
0

データにメモリを割り当てましたか?どこにも見えません。しかし、私はそのようなコンストラクターでさえ気にしません。ディメンションをパラメーターとして(またはテンプレートパラメーターとして)取得し、std::vectorを使用します。N * M要素でベクトルを初期化し、要素アクセスのために演算子()をオーバーロードします。

double& operator () (std::size_t i, std::size_t j);
const double& operator () (std::size_t i, std::size_t j) const;
于 2012-03-05T21:25:06.977 に答える
0

みんなが指摘したように、あなたはスペースを割り当てませんでしたdata。さらに、便利なデストラクタ、コピーコンストラクタ、および代入演算子を提供する必要があります。

使用すると、このミシガスはすべて消えますstd::vector

std::vector<double> data;
Matrix::Matrix(int M, int N, double* input_data)
  : M(M), N(N), data(input_data, input_data+M*N)
{
  // No work required in here
}
于 2012-03-05T21:41:51.347 に答える