не может преобразовать double (*) [4] в double ** в назначении - PullRequest
0 голосов
/ 13 мая 2018

Я читал урок здесь . Я наткнулся на следующие строки кода.

double** pvalue  = NULL;      // Pointer initialized with null 
pvalue  = new double [3][4];  // Allocate memory for a 3x4 array 

Когда я его скомпилировал, выдает ошибку

"не может преобразовать 'double (*) [4]' в" double ** "в назначении"

Код недействителен? или я делаю что-то не так. Также, если возможно, опишите, как я могу объявить указатель на многомерный массив?

Ответы [ 5 ]

0 голосов
/ 13 мая 2018

Как явно сказал вам компилятор, new double [3][4] вычисляет указатель double (*)[4] типа

double (*pvalue)[4] = new double [3][4];

Вы не можете сохранить это значение в указателе double **.

P.S. «Учебник», на который вы ссылаетесь, является просто бессмысленным мусором.

0 голосов
/ 13 мая 2018

Если вы хотите сохранить выделение двумерного массива,

  new double [3][4]

есть два способа обратиться к этому фрагменту памяти: 1.,

  double* pvalue  = NULL;
  pvalue  = (double*)new double [3][4];

и 2.,

  double (* parray)[4] = NULL;
  parray = new double [3][4];

, если вы хотите сохранить переменную указатель-указатель, т. Е. double** ppvalue, тогда

  double** ppvalue  = NULL;
  ppvalue = new double*[3];     (a)
  for(int i =0; i<3; i++)
      ppvalue[i]=new double[4]; (b)

в основном вам нужно выделить память для массивауказателей (a), и заполните эти указатели конкретными адресами.

Код, который вы отправили

double** pvalue  = NULL;      // Pointer initialized with null 
pvalue  = new double [3][4];  // Allocate memory for a 3x4 array 

, не работает, потому что нет способа вычесть смещение pvalueхотя это выглядит очень красиво и понятно.

Я также вставляю полный код тестирования, чтобы вы могли сыграть:

#include <stdio.h>

int main() {
  double* pvalue  = NULL;
  pvalue  = (double*)new double [3][4];

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
      *(pvalue+i*4+j) = (double)i*(double)j;
      printf("%f\n", *(pvalue+i*4+j));
    }
  }

  double (* parray)[4] = NULL;
  parray = new double [3][4];

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
      parray[i][j] = (double)i*(double)j;
      printf("%f\n", parray[i][j]);
    }
  }

  double** ppvalue  = NULL;
  ppvalue = new double*[3];
  for(int i =0; i<3; i++)
      ppvalue[i]=new double[4];

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
      ppvalue[i][j] = (double)i*(double)j;
      printf("%f\n", ppvalue[i][j]);
    }
  }
}
0 голосов
/ 13 мая 2018

Вы не можете сделать это.Если вам нужно распределить память самостоятельно, попробуйте:

double** pt=nullptr;
pt=new double[3];
for(std::size_t i=0;i<3;++i)
    pt[i]=new double[4];

удаление - это обратный процесс выделения.

И одна вещь, которую вы должны заметить, это то, что вы не должны использовать range-based for non-member begin and end function или sizeof operator, поскольку pt является , а не массивом.

0 голосов
/ 13 мая 2018

Вы не можете сделать это.double [3][4]; выделяет плоскую память из 3 массивов double[4].В учебнике есть ошибка.

using d4 = double [4];
// or typedef double d4[4];
d4* pvalue  = nullptr;
pvalue  = new double [3][4];
delete[] pvalue;
0 голосов
/ 13 мая 2018

Это pvalue = new double [3][4]; не правильно. Узнайте, как выделить память для 2D-массива, используя new. Может быть, вы хотите, как показано ниже.

int main(void) {
        double** pvalue  = NULL;        
        /* first allocate for pvalue */  
        pvalue  = new double *[3];  
        for(int col = 0; col < 3 ; col++ )
                /* allocate for each palue element */
                pvalue[col] = new double [4];
        return 0;
}

После этого не забудьте освободить динамически выделенную память, вызвав delete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...