Cita: Mi duda es que ambos serian prototipos ¿no?
double (*pmag)(struct Vector *);
declara a la vez que define el puntero a función pmag.
double *pmag(struct Vector *);
declara la función pmag que necesita ser definida en algún lado.
Cita: ¿como le asignó una función al primer caso?
se usan dos formas técnicamente equivalentes, pero
que como siempre algunos prefieren una forma y otros la otra.
Por ejemplo, si tenés una función f declarada como:
double f(Vector* v);
se puede asignar:
Código:
pmag = f; // más común
pmag = &f; // lo mismo pero despierta fanatismos
Te paso un ejemplo simple:
Código C++:
Ver original#include <iostream>
struct Vector {
double a;
double b;
};
double sumar(Vector* v)
{
return v->a + v->b;
}
double restar(Vector* v)
{
return v->a - v->b;
}
int main ()
{
double res;
Vector v{3, 2};
double (*pmag)(struct Vector*);
// o double (*pmag)(Vector*); que es lo mismo sin la palabra "struct"
pmag = nullptr; // asigna a pmag el puntero nulo.
pmag = sumar; // asigna a pmag el puntero a sumar()
res = pmag(&v); // invoca a sumar() a través del puntero pmag
std::cout << "suma = " << res << '\n';
pmag = restar; // asigna a pmag el puntero a restar()
res = pmag(&v); // invoca a restar() a través del puntero pmag
std::cout << "resta = " << res << '\n';
}
Saludos!
P.D: y por favor, a los aconsejadores compulsivos les voy a pedir que tomen esto como una forma rápida y simple de responder a un par de preguntas, no pretendo hacer una próxima librería para las boost ni espero que nadie vaya a quere ampliar o mantener esto en el futuro, así que por favor no se molesten, cuando necesite un consejo voy a saber pedirlo solito