Итак, я пытался написать структуру с функциями указателя, и вот что я написал
typedef struct Coordinates {
float x;
float y;
} Coord;
typedef struct Parallelograms {
Coord upperR, lowerL;
float base;
float (*areaFunc)(float base, Coord upperR, Coord lowerL);
float (*perimeter)(float base, Coord upperR, Coord lowerL);
} Parallelogram;
Здесь я определяю функцию:
float area(float base, Coord upperR, Coord lowerL) {
return (base*(upperR.y-lowerL.y));
}
А затем в какой-то другой функции я называю это так:
Parallelogram para;
para.areaFunc = area;
Единственное, что когда я пытаюсь его распечатать
printf("Area = %.2f", array[i].area);
(при этом массив представляет собой массив объектов типа параллелограмм) Он возвращает эту ошибку при компиляции:
format specifies type 'double' but the argument has type 'float ()(float, Coord, Coord)' (aka 'float ()(float, struct Coordinates, struct Coordinates)') [-Werror,-Wformat] ...printf("# Area = %.2f #\n", array[I].areaFunc);
Я думал, что правильно понял функции указателя, так как же мне преобразовать функцию указателя в фактическое значение, которое она должна возвращать?
@Someprogrammerdude извините за это ... Я делал один, но получил ответ от Шона Брайта, прежде чем смог его закончить. В любом случае спасибо
Если array
представляет собой массив Parallelogram
s:
printf("Area = %.2f", array[i].areaFunc(array[i].base, array[i].upperR, array[i].lowerL));
Ваш текущий код пытается распечатать указатель функции как число с плавающей запятой, что явно неверно. Вам нужно вызов функцию, на которую указывают.
Спасибо, это решило проблему. Но если он такой длинный, в чем преимущества использования функций указателя? Разве это не то же самое, что определить функцию с параметром типа структуры, а затем вызвать ее самостоятельно?
@L_Cleo Если вы всегда вызываете одну и ту же функцию, да, но указатели функций позволяют вам вызывать разные функции на основе данных. Можно было бы иметь функции area
для квадратов и кругов и сохранить тот же интерфейс.
@NeilEdelman Хорошо, тогда я думаю, мне придется сделать пример программы, которая действительно будет рассматривать эти функции указателя как более удобные, чем простое определение функции. Спасибо
См. stackoverflow.com/questions/12971995/… и stackoverflow.com/questions/351733/…, а в статье Википедии есть несколько примеров, en.wikipedia.org/wiki/Указатель_функции.
Пожалуйста, попробуйте создать правильный минимальный воспроизводимый пример, который повторяет проблему, и покажите его нам. Код, который вы показываете, не соответствует ошибке, которую вы получаете. И, пожалуйста, включите копию полный и полный вывода сборки этого примера. Также обновите как задавать хорошие вопросы, а также контрольный список этого вопроса.