Вопрос

Привет, у меня возникла проблема с 2D-динамическим массивом.

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }

   M[0][0] = 1.0;

...
}

Программа работает, но я хотел бы инициализировать 2D-массив, используя такую ​​функцию:

void initialize2D(double **M,int M_dimension)
{
   int i;
   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }
}

В итоге программа выглядит так:

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   initialize2D(M,M_dimension);        

   M[0][0] = 1.0; //crash

...
}

К сожалению, он выходит из строя в M[0][0] = 1.0;

Спасибо за любую помощь или предложения.

Это было полезно?

Решение

Вы проходите мимо M по значению, а не по ссылке. initialize2D необходимо изменить значение указателя на указатель M так, что он указывает на выделенную память

Вместо этого попробуйте изменить сигнатуру функции на следующую:

void initialize2D(double **&M,int M_dimension)

Или

void initialize2D(double ***M,int M_dimension) {
    ...
    *M = new double *[M_dimension];
    ...
}

Другие советы

Для работы необходимо передать ссылку на double ** вместо double ** , в противном случае изменение будет выполнено для указателя после присвоения M результата новый теряется при выходе из функции.

проблема может быть в том, что вы объявляете целочисленный параметр, такой как int M_dimension void initialize2D (double ** M, int M_dimension)

и затем вы инициализируете динамический массив как: M [i] = новый двойной [M_dimension];

где возникает противоречие, потому что вы объявили переменную M_dimension как целое число, а затем использовали ее как двойное число

попробуйте это так: либо измените тип данных массива или M_dimension, чтобы оба они имели одинаковый тип данных.

надеюсь, это поможет вам

Почему бы вам не использовать std :: vector или Boost.MultiArray

Было бы довольно легко определить двумерный массив как общий вектор векторов в C ++

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top