Как передать 'double *' в функцию класса и применить это значение к другому 'double *' в этом классе - PullRequest
0 голосов
/ 06 марта 2012

Я пытаюсь передать double *, который содержит массив double, в конструктор моего класса и назначить элемент value для элемента.

Main:

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] в моей основной функции.

Я предполагаю, что это не должно быть сделано таким образом, и был бы признателен за любое движение в правильном направлении.

Ответы [ 5 ]

3 голосов
/ 06 марта 2012

Похоже, вы не выделяете память для data в своем конструкторе.

Matrix::Matrix(int M, int N, double* input_data)
{
   data = new double[M*N];
   //....
}
1 голос
/ 06 марта 2012

Я предполагаю, что data является членом класса Matrix, объявленным как double*.

Вы должны выделить память для этого члена в своем конструкторе:

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

Донне забудьте позвонить delete[] data; в деструктор.Вам также следует позвонить delete[] data; в конце main.

0 голосов
/ 06 марта 2012

Как все отметили, вы не выделяли место для 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
}
0 голосов
/ 06 марта 2012

Вы выделяли память для данных? Не могу видеть это нигде. Однако я бы даже не стал возиться с таким конструктором. Просто возьмите размеры в качестве параметров (или в качестве параметров шаблона, но я думаю, это другое) и используйте 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 голосов
/ 06 марта 2012

Вы никогда не выделяли память для хранения данных.

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. В противном случае вы назначаете неопределенное местоположение, которое может быть где угодно.

...