0

doubleの配列を保持するdouble *をmyクラスのコンストラクタに渡そうとしています要素にvalue要素を割り当てます。クラス関数に 'double *'を渡して、そのクラスの別の 'double *'にその値を適用する方法

メイン:

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]のデータに索引付けすることができます。

私はこれをこのようにしてはならないと仮定しており、適切な方向への任意の動きを感謝します。

+2

あなた 'マトリックス:: data'ように見えるんどのように?どこでどのように初期化されますか? – Griwes

+0

ここに掲載されたコードに問題はありません。あなたのクラス定義を投稿できますか? – Dennis

+0

@Griwesは 'data'が動的に割り当てられているようだから(MとNがパラメータとして渡されます)、これは問題だと思われます。彼はメモリを割り当てていません。 –

答えて

3

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

Matrix::Matrix(int M, int N, double* input_data) 
{ 
    data = new double[M*N]; 
    //.... 
} 
+0

非常に義務付けられている!なぜ私は最小のエラーを見つけることができないのですか?<これはオーバーロードされたコンストラクタであり、オリジナルには割り当てが含まれているので、これを逃すことについての言い訳はありません。 – LBHoward

+0

@LB助けてよろしいですか? –

+0

@LBHowHardも、LihOが指摘したように、デストラクタでメモリを解放することを忘れないでください。 –

0

データを格納するメモリは決して割り当てられませんでした。 C++で

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*** 
     } 
    } 

} 

は、そのような動的配列を可能にするために、明示的に、データが大き N * Mの配列であると言うする必要があります。それ以外の場合は、どこにでも配置できる未定義の場所に割り当てます。

1

dataMatrixのメンバーであり、double*と宣言されているものとします。

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

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

はデストラクタでdelete[] data;を呼び出すことを忘れないでください。また、メインの最後にdelete[] data;と呼ぶべきです。

+0

ちょうどnit-pickingのために、とにかくメモリが解放されるので、 'main()'で 'delete [] data;'を呼び出す必要はありません。 –

+0

@LuchianGrigore:本当ですが、私はまだそれを呼び出すことをお勧めします。少なくとも、あなたは自分自身の後で掃除に慣れるでしょう。 – LihO

+0

それは本当です.... –

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; 
0

、あなたはdataのためのスペースを割り当てることができませんでした。さらに、便利なデストラクタ、コピーコンストラクタ、代入演算子を用意する必要があります。

あなたがstd::vectorを使用する場合は、このmishigasのすべてが消える:

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 
} 
関連する問題