Krótko i na temat:
Podajesz błędny typ dla przekazywanej funkcji. Zamiast
double * (fun)
w deklaracji i definicji funkcji calculate powinno być
double (*fun)(double, double)
Jeżeli masz Symfonię C++ Grębosza, to jest tam dość fajnie napisane jak tworzyć definicje odpowiednich wskaźników na funkcje. Jeśli nie, to przyjrzyj się powyższemu przykładowi i spróbuj na jego podstawie to przećwiczyć tworząc wskaźniki służące do "pokazywania" na funkcje innego typu - wtedy załapiesz w mig.
---
double calculate (double p, double m, double (*fun)(double, double))
{
double q = add (p, m);
return q;
}
Tutaj zawsze wywołujesz funkcję add, a chcesz wywołać funkcję przekazywaną przez wskaźnik, a więc poprawnie powinno być:
double q = fun(p, m);
Pozdrawiam! 