Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi function->tfunction (https://www.delphipraxis.net/142668-function-tfunction.html)

vsilverlord 1. Nov 2009 11:14


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:
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;
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!
//edit: integer in extended verändert

mkinzler 1. Nov 2009 11:16

Re: function->tfunction
 
Wie äussert sich das Nichtfunktionieren? Fehlermeldung?

vsilverlord 1. Nov 2009 11:18

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;

mkinzler 1. Nov 2009 11:21

Re: function->tfunction
 
In welcher zeile?
Ich vermute es liegt an sin

vsilverlord 1. Nov 2009 11:24

Re: function->tfunction
 
ja, es funktioniert aber mit keiner mathematischen funktion (z.b ln)

guidok 1. Nov 2009 11:25

Re: function->tfunction
 
Zitat:

Zitat von vsilverlord
type
tfunction= function(a:extended):extended;

var
zahlen:array of integer;

[/delphi]

Liegt es vielleicht daran das die Funktion als Ergebnis extended zurückgibt und deine Zahlen vom Typ integer sind?

vsilverlord 1. Nov 2009 12:47

Re: function->tfunction
 
ah nein, das war nur in diesem beispiel falsch! :wall: im richtigen quelltext ist das schon extended, es funktioniert trotzdem nicht!

himitsu 1. Nov 2009 13:07

Re: function->tfunction
 
also bei mir funktioniert dein Beispiel aus der #1

und zwar mit nur einer kleinen Änderung :angel2:
Delphi-Quellcode:
tfunction = function(const a: extended): extended;
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.

sx2008 1. Nov 2009 13:14

Re: function->tfunction
 
Zitat:

Zitat von vsilverlord
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!

Du kennst wahrscheinlich das Strategie-Design-Pattern noch nicht.
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:
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;
Man könnte jetzt z.B. 5 Objekte der Klasse TSinusFunktion erzeugen, wobei jedes Objekt andere Werte
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.

himitsu 1. Nov 2009 13:21

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:
// Einzelfunktion
tfunction = function({params}; private: Integer): result;

// Methode
tmethod = function({params}): result of object;
nur daß bei dem Objekt die Funktion intern eigentlich so aussieht
Delphi-Quellcode:
tmethod = function(self: TObject; {params}): result;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz