Определение функции указателя внутри структуры

Итак, я пытался написать структуру с функциями указателя, и вот что я написал

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);

Я думал, что правильно понял функции указателя, так как же мне преобразовать функцию указателя в фактическое значение, которое она должна возвращать?

Пожалуйста, попробуйте создать правильный минимальный воспроизводимый пример, который повторяет проблему, и покажите его нам. Код, который вы показываете, не соответствует ошибке, которую вы получаете. И, пожалуйста, включите копию полный и полный вывода сборки этого примера. Также обновите как задавать хорошие вопросы, а также контрольный список этого вопроса.

Some programmer dude 19.06.2019 19:55

@Someprogrammerdude извините за это ... Я делал один, но получил ответ от Шона Брайта, прежде чем смог его закончить. В любом случае спасибо

L_Cleo 19.06.2019 20:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если array представляет собой массив Parallelograms:

printf("Area = %.2f", array[i].areaFunc(array[i].base, array[i].upperR, array[i].lowerL));

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

Спасибо, это решило проблему. Но если он такой длинный, в чем преимущества использования функций указателя? Разве это не то же самое, что определить функцию с параметром типа структуры, а затем вызвать ее самостоятельно?

L_Cleo 19.06.2019 20:09

@L_Cleo Если вы всегда вызываете одну и ту же функцию, да, но указатели функций позволяют вам вызывать разные функции на основе данных. Можно было бы иметь функции area для квадратов и кругов и сохранить тот же интерфейс.

Neil 19.06.2019 20:56

@NeilEdelman Хорошо, тогда я думаю, мне придется сделать пример программы, которая действительно будет рассматривать эти функции указателя как более удобные, чем простое определение функции. Спасибо

L_Cleo 20.06.2019 00:29

См. stackoverflow.com/questions/12971995/… и stackoverflow.com/questions/351733/…, а в статье Википедии есть несколько примеров, en.wikipedia.org/wiki/Указатель_функции.

Neil 23.06.2019 21:50

Другие вопросы по теме