Предупреждение C4047: «int **» отличается уровнем косвенности от «int [2] [4]»

Я получаю это предупреждение и ломаю голову, почему. Я нашел здесь много потоков, которые обращаются к этому предупреждению в компиляторе VS 2017, но не к этой конкретной комбинации: почему int ** не имеет того же уровня косвенности, что и int [X] [Y]?

Вот дистиллированный пример, который генерирует предупреждение:

void testfunc(int ** input, int ** output) {

  /*
  * Do something
  */

}


int main()
{


  int   firstvar[2][4];
  int   secondvar[2][4];

  testfunc(firstvar, secondvar);

}

Я получил:

testcode.c(46): предупреждение C4047: 'функция': 'int **' отличается уровнями косвенности от 'int [2][4]'

Любые мысли о том, почему это может быть или как это исправить, очень ценятся.


person DMK    schedule 28.01.2019    source источник
comment
int** не является двумерным массивом. Вы не можете получить доступ к элементам 2D-массива, используя такой указатель.   -  person Eugene Sh.    schedule 28.01.2019
comment
Массивы не являются указателями. Массивы распадаются на указатели, но это не означает, что двумерный массив может распадаться на указатель на указатель. c-faq.com/aryptr/index.html   -  person jamesdlin    schedule 28.01.2019


Ответы (1)


void testfunc(int input[][4], int output[][4])

было бы лучше пройти это. Обратите внимание, что int ** указывает на то, что это массив int *, но это не так.

void onedimension_testfunc(int *odinput, int *odoutput)
{
     ...
}

int main ()
{
      int odfirst[4], odsecond[4];
      onedimention_testfunc(odfirst, odsecond);
}

В одном измерении приведенный выше код работает нормально. Это потому, что odinput/odoutput в приведенном выше коде указывает на целочисленный массив. Но не для нескольких измерений.

person user2962885    schedule 28.01.2019
comment
И стоит отметить, что фактически переданный тип будет int (*input)[4] - person Eugene Sh.; 28.01.2019
comment
Спасибо за ответ. Причина, по которой я не передал его как int[][4], заключается в том, что фактические размеры будут переменными. Я думаю, мне нужно будет перепроектировать это как одномерную структуру и передать также величину первого измерения, чтобы к нему можно было получить доступ как rowsize*r +c - person DMK; 28.01.2019
comment
Вам не нужно использовать одномерные массивы, если ваши данные двумерные. Просто используйте 2d-массивы переменного размера в качестве параметров, например: void testfunc(size_t n, size_t m, int input[n][m], int output[n][m]) И назовите это так: testfunc(2, 4, firstvar, secondvar); - person HAL9000; 29.01.2019