Я пытаюсь скомпилировать следующий фрагмент кода C:
void bar(char** foo) {
foo[0][0] = '\0';
}
int main() {
char foo[1][1];
bar(&foo);
}
и я получаю следующее предупреждение:
main.c: In function ‘main’:
main.c:7:7: warning: passing argument 1 of ‘bar’ from incompatible pointer type [-Wincompatible-pointer-types]
7 | bar(&foo);
| ^~~~
| |
| char (*)[1][1]
main.c:1:17: note: expected ‘char **’ but argument is of type ‘char (*)[1][1]’
1 | void bar(char** foo) {
| ~~~~~~~^~~
Скажите, пожалуйста, как мне с этим справиться? Я могу изменить только подпись функции bar
.
@wohlstad, что если я не знаю заранее первую часть? Я хотел бы работать с матрицей произвольного размера.
&foo
в main создает указатель на 2d-массив, а не указатель на указатель, как того требует функция bar.
Вам необходимо изменить свою функцию, если вы хотите передавать параметры таким образом.
void bar(size_t cols, size_t rows, char (*foo)[rows][cols]) {
(*foo)[0][0] = '\0';
// (*foo) is giving a 2d char array
// then you can index it normally
}
int main() {
char foo[1][1];
bar(1,1,&foo);
}
или лучше
void bar(size_t cols, size_t row, size_t col, char (*foo)[cols]) {
foo[row][col] = '\0';
}
int main() {
char foo[5][10];
bar(10, 3, 2, foo);
//it will set foo[3][2] to '\0'
}
или если ваш компилятор не поддерживает VLA
void bar(char (*foo)[5][10]) {
(*foo)[0][0] = '\0';
}
int main() {
char foo[5][10];
bar(&foo);
}
или если вы заранее не знаете размер массива и компилятор игрушки не поддерживает VLA
void bar(size_t cols, size_t rows, size_t row, size_t col, void *foo) {
char *cfoo = foo;
cfoo[row * cols + col] = '\0';
}
int main() {
char foo[5][10];
bar(5,10,2,3,foo);
// it will set foo[2][3] to '\0'
}
Использование void bar(size_t cols, size_t row, size_t col, char (*foo)[cols])
, col
и cols
может сбить с толку. Может быть что-то вроде void bar(size_t updateElementRow, size_t updateElementCol, size_t arrayCols, char (*foo)[arrayCols])
? Я думаю, что аргумент, обозначающий количество столбцов в массиве, должен быть смежным с аргументом массива.
Вы можете изменить
bar
, чтобы принятьchar foo[][1]
, а затем вызвать с помощьюbar(foo)
. Смотрите демо .