Не знаю, как извлечь двумерные массивы в трех измерениях C - PullRequest
0 голосов
/ 17 января 2019

Это моя пустота:

struct MateMessage newMate(char** cr){ ...... }

И это мои три измерения args:

char args[3][3][3]

------- Каждый слот «args», если неNULL .---------

И я делаю так:

 newMate(args[1])

Вот что я получаю: [Предупреждение], передавая аргумент 1 из 'newMate'из несовместимого типа указателя

Если вам нужно больше сообщений, пожалуйста, сообщите мне.Спасибо.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Для функции, принимающей массив типа char args[3][3][3], просто используйте это:

struct MateMessage newMate(char args[3][3][3])

Или, если размеры должны быть переменными:

struct MateMessage newMate(size_t x, size_t y, size_t z, char args[x][y][z])
0 голосов
/ 17 января 2019

Хотя одномерный массив очень похож на указатель на элемент массива, многомерный массив не является указателем на указатель ... или массивом указателей. В памяти он организован как одномерный массив, единственное отличие состоит в том, что компилятор знает, как вычислить адрес из более чем одного индекса.

Ваш массив организован в памяти, как это

a000 a001 a002 a010 a011 a012 a020 a021 a022 a100 a101 a101 ...

, где a[0][0][0] и т. Д. Записано как a000 и т. Д. Для экономии места. Вы можете сделать

newMate(args[1])

если вы определите newMate, чтобы взять двумерный массив

struct MateMessage newMate(char cr[3][3]) {
    int i,j;
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++) {
            doSomethingWith(cr[i][j]);
        }
    }
    return something;
}

В этом случае функция, вызывающая абонента, передаст адрес a[1][0][0] на newMate, а newMate узнает, как обратиться к оставшимся двум измерениям.

0 голосов
/ 17 января 2019

args[1] - это массив массивов, а массив массивов не совпадает с указателем на указатель.

Однако может указывать на указатель на массив. В вашем случае args[1] будет распадаться на тип char (*)[3]. Какой тип нужно использовать для аргумента:

struct MateMessage newMate(char (*cr)[3]){ ...... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...