2009-07-14 6 views
2

In Numerical Recipes sie etwas verwenden, habe ich noch nie zuvor getan gesehen und nicht leicht Informationen finden konnte:Was passiert mit 'Funktionszeiger' oder 'Verweis auf Funktion' als Argument, um in C++ zu funktionieren?

void fun(std::vector<double> derivatives(const double, const std::vector<double> &)) { ...; derivatives(...); ...; } 

Was ich bin zu raten, wird das Bestehen der Funktion als Referenz (das ist richtig)? Warum wäre dies vorteilhaft für die Verwendung eines Funktionszeigers? In welcher Situation wird jede Methode bevorzugt?

Ich habe ein zweites Problem: Wenn ich die Funktion zum ersten Mal aufrufen, hängt das Programm für einige Sekunden. Nun wird das Argument Funktion Ich gehe in, selbst, ruft eine andere Funktion aus einem Funktionszeiger heißt

vector<double>(*pfI)(const double) = NULL; 
    ... 
    pfI = pointedToFun; 
    void argFun() { ...; deRefPointedFun = (*Theta::pfI)(t); deRefPointedFun(); } 

Was ist der bessere Weg 2 Ebene von referenced/Zeigerfunktionen zu behandeln?

Antwort

9

Dies entspricht

void fun(std::vector (*derivatives)(const double, const std::vector &)) { 
    ...; derivatives(...); ...; 
} 

Und ähnlich, wie

void f(int derivatives[]) { ... } 

an folgende

entspricht
void f(int *derivatives) { ... } 

So der Parameter ein Funktionszeiger ist. Funktionen als Parameter sind Funktionszeiger. Und Arrays als Parameter sind Zeiger auf ihren Elementtyp. Es ist nicht ähnlich wie

void fun(std::vector (&derivatives)(const double, const std::vector &)) { 
    ...; derivatives(...); ...; 
} 

, die ein Verweis auf eine Funktion ist, aber nur selten verwendet: Es kann nicht für Funktionszeiger Argumente verwendet werden, während ein Funktionszeiger Parameter kann für die Funktion, Funktionsaufrufe und Funktionszeiger verwendet werden, Argumente.

+1

Als Ergänzung: Syntax in Frage scheint klarer als mit * -Syntax. Ich denke, das ist der Grund, warum sie es benutzt haben. –

+0

In Ordnung - das macht mehr Sinn. Haben Sie eine Idee, warum das Programm hängt, bevor der Anruf des ersten auf Funktion hingewiesen hat (ich habe eine Spur gemacht und es wartet genau auf diesen Anruf)? – bias

+2

Ich denke nicht, dass das Problem mit Zeigern auf Funktionen ist. Sie sollten hier minimalen Code posten, der das Problem zeigt, damit wir Ihnen helfen können. –

Verwandte Themen