![]() |
function->tfunction
hallo, ich möchte eine variable function nutzen.
Diese soll als parameter für eine procedure dienen, sodass ich funktionen einsetzen kann :stupid: . so soll es funktionen (tut es aber nicht), es ist aber nicht der orginal quelltext, sondern nur das wesentliche:
Delphi-Quellcode:
ach ja, was ich noch sagen wollte: bitte sagt mir nicht, dass das blöde ist, und dass das viel zu umständlich ist; ich hab das total durchgedacht, so ist der beste Weg!
uses (...)math;
(...) type tfunction= function(a:extended):extended; (...) var zahlen:array of extended; (...) procedure trape(parameterfunction: tfunction); var i:integer; begin for i:=0 to length(zahlen)-1 do begin zahlen[i]:=parameterfunction(zahlen[i]); end; end; (...) procedure sintrape; begin trape(sin) end; //edit: integer in extended verändert |
Re: function->tfunction
Wie äussert sich das Nichtfunktionieren? Fehlermeldung?
|
Re: function->tfunction
-> inkompatible typen
ich hab es sogar mal so gemacht, dass ich die sin-function umgeschrieben habe, hat aber auch nicht geklappt:
Delphi-Quellcode:
function newsin(a:extended):extended;
begin result:=sin(a); end; |
Re: function->tfunction
In welcher zeile?
Ich vermute es liegt an sin |
Re: function->tfunction
ja, es funktioniert aber mit keiner mathematischen funktion (z.b ln)
|
Re: function->tfunction
Zitat:
|
Re: function->tfunction
ah nein, das war nur in diesem beispiel falsch! :wall: im richtigen quelltext ist das schon extended, es funktioniert trotzdem nicht!
|
Re: function->tfunction
also bei mir funktioniert dein Beispiel aus der #1
und zwar mit nur einer kleinen Änderung :angel2:
Delphi-Quellcode:
in der OH steht es zwar anders, aber da du ja die Delphi-Quellcodes hast, hättest du da auch selber mal genauer nachsehn können.
tfunction = function(const a: extended): extended;
|
Re: function->tfunction
Zitat:
![]() Anstelle eines Funktionszeigers wird ein Objekt einer Klasse übergeben. Das eröffnet völlig neue Möglichkeiten. Angenommen du möchtest einer Funktionsplotter schreiben und die Funktionen dynamisch übergeben. Wenn du aber eine ganze Kurvenschar anzeigen möchtest ergibt sich ein Problem: Für jede Funktion muss ein anderer Funktionszeiger übergeben werden.
Delphi-Quellcode:
Man könnte jetzt z.B. 5 Objekte der Klasse TSinusFunktion erzeugen, wobei jedes Objekt andere Werte
TMatheFunktion = class(TObject) // allgemeine Basisklasse
public function CalcY(x:extended):extended;virtual;abstract; end; TSinusFunktion = class(TMatheFunktion) public Omega : extended; Phi : extended; function CalcY(x:extended):extended;override; constructor Create; end; function TSinusFunktion.CalcY(x:extended):extended; begin Result := sin(Omega*x + Phi); end; constructor Create; begin inherited; Omega := 1.0; Phi := 0.0; // defaultwerte setzen end; für Omega und Phi hat. Diese Objekte übergibt man dem Funktionsplotter der dann alle X-Werte von -10 bis +10 durchläuft und den Y-Wert durch Aufruf der CalcY()-Funktion für jedes der Objekte ermittelt. Dadurch erhält man 5 verschiedene Kurven. |
Re: function->tfunction
@sx2008: dein Strategie-Design-Pattern entspricht einem bekannten Verhalten, welches man schon seit Jahren selbst von der WinAPI her kennt.
Delphi-Quellcode:
nur daß bei dem Objekt die Funktion intern eigentlich so aussieht
// Einzelfunktion
tfunction = function({params}; private: Integer): result; // Methode tmethod = function({params}): result of object;
Delphi-Quellcode:
tmethod = function(self: TObject; {params}): result;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 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 by Thomas Breitkreuz