AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionen als Parameter übergeben

Ein Thema von Alexander Roth · begonnen am 1. Aug 2006 · letzter Beitrag vom 8. Aug 2006
Antwort Antwort
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#1

Funktionen als Parameter übergeben

  Alt 1. Aug 2006, 17:19
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:
function f(x:real):real; //Die Mathematik-Funktion

function Nullstelle(funktion:Tfunction):real; //die Fukntion der ich die Fukntion übergebe
Also ich hoffe das ist verständlich.
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
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Fukntionen als Parameter übergeben

  Alt 1. Aug 2006, 17:21
Delphi-Quellcode:
type
tmyFunction = function (x:real):real;

function s_function( theFunc: TmyFunction ):Real;
begin
  Result := theFunc( 5 );
end;
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Fukntionen als Parameter übergeben

  Alt 1. Aug 2006, 17:23
Delphi-Quellcode:
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);
[edit]
i wünscht mir 'ne RedBox o.O
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Fukntionen als Parameter übergeben

  Alt 1. Aug 2006, 17:27
Jo danke also compilieren tut er es.

Danke

Tschüss

Alexander
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Funktionen als Parameter übergeben

  Alt 1. Aug 2006, 18:01
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:
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;
Ja, dann kannst du später einfach einen Aufruf mit einem beliebigen Nachfahren starten

Delphi-Quellcode:
procedure doFoo(const instance : TAbstractComputer);
begin
  if assinged(instance) then
  begin
    instance.compute(<Das Argument>);
  end;
end;
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)

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Funktionen als Parameter übergeben

  Alt 8. Aug 2006, 18:06
Entschuldigung dass ich so spät antworte.

Also ein bisschen erweiterte Situation:
Ich habe die Klassen
Delphi-Quellcode:
    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;
und die Funktion
Delphi-Quellcode:
function NullStelle(Funktion:TSonnenstandsFunktion):real;
begin
  result:=Funktion(ds.BG,ds.LG,ds.hour,ds.day,ds.month,ds.year);
end;
die ich zu Testzwecken nur mit beispielwerten füttere anstadt die Nullstelle auszurechnen.

Die Variable:
  Sonne:TSonne; Wie übergebe ich die Methode getalpha oder getbeta der Variable Sonne an die Funktion Nullstelle?
So klappt es natürlich nicht:
  showmessage(floattostr(NullStelle(@Tsonne.getbeta))); und so compiliert er es leider nicht:
  showmessage(floattostr(NullStelle(@sonne.getbeta)));
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Funktionen als Parameter übergeben

  Alt 8. Aug 2006, 18:28
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
function(...) : real of Object verwenden (also ein of Object ranhängen).

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Funktionen als Parameter übergeben

  Alt 8. Aug 2006, 20:10

Es klappt!!!

Riesen Dank.



PS:
Hinweis an die Leser : Keinen Pointer auf die Methode übergeben, sondern direkt
x := Nullstelle(sonne.getbeta);
PPS: @Der_Unwissende: Willst nicht vielleicht das Un von Der_Unwissende streichen?
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr.
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