![]() |
Funktionen als Parameter übergeben
Hallo,
also die Funktionen in Delphi eignen sich ideal um sie als Mathematik-Funktionen zu nutzen. Also Real übergeben und Real kommt raus. Da ich unteranderem viele von diesen Delphi=Mathe-Fukntionen habe, und ich mit denen die gleichen Operationen mit ihnen machen will würde sich so was anbieten:
Delphi-Quellcode:
Also ich hoffe das ist verständlich.
function f(x:real):real; //Die Mathematik-Funktion
function Nullstelle(funktion:Tfunction):real; //die Fukntion der ich die Fukntion übergebe Wie kann man so was realisieren? PS: Falls die Frage kommt --> Nein, ich kann die Funktion f nicht in einem anderen Format speichern, da die Funktion f mit sehr vielen Schritten berechnet wird (mit Bedingungen), und ist streng genommen eine sehr komplexe (rationale) zusammengesetzte Funktion. :) Gruß Alexander Edit: Immer diese Rechtschreibfehler |
Re: Fukntionen als Parameter übergeben
Delphi-Quellcode:
type
tmyFunction = function (x:real):real; function s_function( theFunc: TmyFunction ):Real; begin Result := theFunc( 5 ); end; |
Re: Fukntionen als Parameter übergeben
Delphi-Quellcode:
[edit]
Type TMathFunc = Function(x: Real): Real;
Function f(x: Real): Real; Function Nullstelle(Funktion: TMathFunc): Real; Begin Result := Funktion(123.456); End; x := Nullstelle(@f); i wünscht mir 'ne RedBox o.O |
Re: Fukntionen als Parameter übergeben
Jo danke also compilieren tut er es. :thumb:
Danke Tschüss Alexander :hi: |
Re: Funktionen als Parameter übergeben
Hi,
ich möchte hier nur kurz noch den OOP Ansatz der Vollständigkeit halber zugeben: Du kannst so was natürlich auch immer in einem Interface/einer abstrakten Klasse einführen und dann verwenden:
Delphi-Quellcode:
Ja, dann kannst du später einfach einen Aufruf mit einem beliebigen Nachfahren starten
type
TAbstractComputer = class(TObject) public function compute(x : Real) : Real; virtual; abstract; end; TConcreteComputer = class(TVorfahrTyp) public function compute(x : Real) : Real; override; // hier natürlich dein Implementierung end;
Delphi-Quellcode:
Das ganze entspricht dann einfach nur dem Objektorientierten Ansatz (den man überall dort verwenden müsste, wo es schon keine Funktionszeiger gibt). Ist sogar ein Designpattern (wie gesagt der Vollständigkeit halber)
procedure doFoo(const instance : TAbstractComputer);
begin if assinged(instance) then begin instance.compute(<Das Argument>); end; end; Gruß Der Unwissende |
Re: Funktionen als Parameter übergeben
Entschuldigung dass ich so spät antworte.
Also ein bisschen erweiterte Situation: Ich habe die Klassen
Delphi-Quellcode:
und die Funktion
TSonnenstandsFunktion=function(BG,LG:real; time:real; day,month:byte; year:integer):real;
TSonne = class public function getalpha(BG,LG:real; time:real; day,month:byte; year:integer):real; function getbeta(BG,LG:real; time:real; day,month:byte; year:integer):real;
Delphi-Quellcode:
die ich zu Testzwecken nur mit beispielwerten füttere anstadt die Nullstelle auszurechnen.
function NullStelle(Funktion:TSonnenstandsFunktion):real;
begin result:=Funktion(ds.BG,ds.LG,ds.hour,ds.day,ds.month,ds.year); end; Die Variable:
Delphi-Quellcode:
Wie übergebe ich die Methode getalpha oder getbeta der Variable Sonne an die Funktion Nullstelle?
Sonne:TSonne;
So klappt es natürlich nicht:
Delphi-Quellcode:
und so compiliert er es leider nicht:
showmessage(floattostr(NullStelle(@Tsonne.getbeta)));
Delphi-Quellcode:
showmessage(floattostr(NullStelle(@sonne.getbeta)));
|
Re: Funktionen als Parameter übergeben
Hi,
es ist ein wichtiger Unterschied ob du eine Funktion aus einer Unit heraus übergeben willst, oder aus einem Objekt. Bei einer Unit liegt die Funktion statisch immer an einer Stelle und alles klappt so, wie du es hier stehen hast. Bei einer Funktion eines Objekts, liegt die Funktion für jedes Objekt (jede Instanz einer Klasse) anders. Deshalb musst du einen Methodenzeiger vom Typ
Delphi-Quellcode:
verwenden (also ein of Object ranhängen).
function(...) : real of Object
Gruß Der Unwissende |
Re: Funktionen als Parameter übergeben
:thumb:
Es klappt!!! Riesen Dank. PS: Hinweis an die Leser :wink: : Keinen Pointer auf die Methode übergeben, sondern direkt
Delphi-Quellcode:
x := Nullstelle(sonne.getbeta);
PPS: @Der_Unwissende: Willst nicht vielleicht das Un von Der_Unwissende streichen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz