Wie Pointer Funktion korrekt ausführen?

...komplette Frage anzeigen

2 Antworten

CMyVektor gradient(CMyVektor x, double(*funktion)(double x, double y))

Statt (double x, double y) einfacher: (double, double). x und y werden nicht gelesen, das ist pure Definition hier!

Du willst in

vektor = gradient(Vektor, (&f) (2.5,3));

im 2. Argument als Parament die Adresse von f übergeben? Aber Du übergibst den Funktionsrückgabewert = double, deswegen der Fehler!

Als Argument übergibst Du den Rückgabewert aus f, das ist double, verlangt als Parament wird jedoch ein Funktionszeiger!

==> Also übergib einen Funktionszeiger!

==> vektor = gradient(vektor,f);

Das müsste gehen. Das ganze Konzept von Dir hat folgenden Fehler: Wenn Du einen Funktionszeiger übergibst, ist das nur die Adresse auf die Funktion, dass ist nur ein offset, da kannst Du nicht auch noch die Parameter an die Adresse ankleben (wie willst Du an eine Adresse noch zwei doubles hinzufügen - das geht nicht!), sondern brauchst weitere Argumente!

CMyVektor gradient(CMyVektor x,double(*Funktion)(double,double),double x,double y)
vektor=gradient(vektor,f,2.5,3.0) // bitte 3.0 statt 3, ansonsten verliert sich der Unterschied zw. int und double

in gradient dann: var_double=Funktion(x,y);

Das ganze ist schon ziemlich pure-C-Style.

Antwort bewerten Vielen Dank für Deine Bewertung

Das liegt an deiner Deklaration von gradient() und der Tatsache, dass Du in deinem Aufruf offensichtlich keine passende Funktion übergibst, sondern wohl nur den Rückgabewert der Funktion.

Die Frage ist nur eher, warum Du soetwas tust. Mit solchen Dingen zerschießt man sich schnell seinen Code oder macht ihn schwer zu interpretieren.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von nobytree2
20.04.2017, 20:01

Die Deklaration von gradient() ist in Ordnung, außer dass keine Parameter für die Funktion übergeben werden können, denn das x und das y werden ignoriert.

Der Fehler ist tatsächlich, dass sie in gradient nicht die Adresse von der Funktion übergeben hat, sondern die Funktion aufgerufen hat.

C# und Java machen so etwas zwar auch (callbacks), aber verdeckt, in C++ werden direkte rohe Zeiger auch eher vermieden. Pure C und Assembler wären hingegen die Sprachen, die solche Techniken offen verwenden.

0

Was möchtest Du wissen?