C «предупреждение: инициализация из несовместимого типа указателя», когда функция имеет массив в качестве аргумента - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь заставить работать массив функций указателя.Тем не менее, я заметил, что я получаю сообщение об ошибке, когда один из аргументов функции является типом массива.Я понятия не имею, почему я получаю сообщение об ошибке

Сообщение об ошибке

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
 void (*p[1])(int, int, int) = { mini };

Код

// function prototype
void min(int row, int col, const int arr[row][col]);


void(*p[1])(int, int, const int) = { min}; // error happens here

int main() {

// rest of code

}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Тип функции, которую вы пытаетесь объявить в качестве цели для типа элемента вашего массива, имеет в качестве третьего параметра двумерный массив переменной длины const int.Однако в объявлении массива вы пытаетесь объявить его как один const int.Они несовместимы.

Самый простой способ объявить это будет выглядеть так:

void(*p[1])(int, int, const int[*][*]) = { min };

или примерно так:

void(*p[1])(int, int, const int[][*]) = { min };

.Два эквивалентны.* в измерении массива указывает VLA неизвестного размера - неизвестно, потому что это зависит от других аргументов.Первое измерение (только) параметра массива всегда можно опустить, и часто я предпочитаю его опускать, но в этом случае я предпочитаю первое объявление, потому что, хотя компилятор игнорирует первое измерение массива, оно понятно для читателей-людей.что это тоже переменное измерение.

0 голосов
/ 02 октября 2018

Компилятор выдает это предупреждение, потому что вы пытаетесь инициализировать первый член указателя массива p типа void (*)(int, int, const int) с min типа void (int, int, const int (*)[col]). Проверьте разницу в третьем параметре обоих типов .

Чтобы исправить это предупреждение, вы можете сделать:

void(*p[1])(int row, int col, const int arr[row][col]) = {min};

Более того, вам не нужномассив указателей на функции, если массив содержит только один член.В этом случае вы можете просто сделать:

void(*p)(int row, int col, const int arr[row][col]) = min;
0 голосов
/ 02 октября 2018

У вас есть const int для указателя функции и int [][] для вашей функции, это не одно и то же.Вместо этого вы должны использовать const int (*)[].

Ваша ошибка исчезнет, ​​если вы правильно объявите void(*p[1])(int, int, const int) как:

void(*p[1])(int, int, const int (*)[]) = {min};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...