Невозможно преобразовать 'int (*)[size]' в 'int**': Cannot convert 'int (*)[size]' to 'int**'

Анализ этого и это отвечает под Arduino, что должно быть правильным способом передачи 2D-массив в функцию?

Функция должна быть применима к разным размерам 2D-массивов.

// ПРИМЕР НЕ СОСТАВЛЯЕТСЯ
void f(int** x,const int m, const int n){
// доступ к x как x[0][0], x[0][1] и т.д...
}

void main{}{
    int x1[16][128];
    f(x1,16,128);
    int x2[64][16];
    f(x2,64,16);
}

, 👍2

Обсуждение

компилятор должен знать размер второго измерения. один из вариантов: void f(int x[][128],const int m){, @Juraj

Я бы предпочел использовать одномерный массив. Не так сложно преобразовать двухмерные индексы в одномерные., @KIIV


1 ответ


Лучший ответ:

2

Согласно прототипу f и шаблону использования его x аргумент, функция ожидает, что этот аргумент будет указателем на первый элемент массива указателей на первые элементы массивов целое. Однако матрица в main() определяется как массив массивов int. Если вы попытаетесь передать это функции, матрица распадется в указатель на массив int. Это не то, что вам нужно.

Если вы хотите, чтобы оба измерения матрицы были переменными, единственный простое решение, которое я вижу, состоит в том, чтобы создать дополнительный массив указателей (указывающих к строкам матрицы) и передать этот массив в функцию

int main() {
    int x[16][128];

    // Строим массив указателей на строки.
    int *px[16];
    for (int i = 0; i < 16; i++)
        px[i] = x[i];

    f(px, 16, 128);
}

Дополнительную информацию об этом см. в разделе Массивы и указатели в часто задаваемые вопросы по языку C и, в частности, вопросы 6.16 (Как я могу динамически выделять многомерный массив?) и 6.19 (Как написать функции, которые принимают двумерные массивы, когда ширина не известен во время компиляции?).

,