AGB  ·  Datenschutz  ·  Impressum  







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

Anonyme methode als Parameter übergeben

Ein Thema von Dennis07 · begonnen am 4. Jul 2015 · letzter Beitrag vom 5. Jul 2015
Antwort Antwort
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
488 Beiträge
 
Delphi 11 Alexandria
 
#1

Anonyme methode als Parameter übergeben

  Alt 4. Jul 2015, 17:20
Delphi-Version: XE5
Hallo,
ich bins mal wieder und ich hab ne frage. Diesmal geht es um anonyme Methoden, die als Parameter einer von mir implementierten Funktion übergeben werden sollen.
Allerdings soll deren Parameterzahl beliebig sein.
Aktuell übergebe ich diese als Pointer meiner Funktion und rufe sie mit dem ASM-Befehl CALL auf.
Das funktioniert auch ganz prima. Nur leider ist ja Inline-Assembly nicht mehr unter x64 erlaubt und so suche ich nach einer geeigneten Alternative. Desweiteren erscheint es mir nicht besonders sauber, nur weil ich nicht weiß wie ich es sonst lösen soll, mitten in ner Funktion eine einzelne ASM-Zeile einzufügen...

Beispiel:
Delphi-Quellcode:
procedure Add(A,B: Integer; var C: Integer);
asm
  ADD EAX,EDX
end;

function Euler: Integer;
begin
  Result := Round(Exp(1));
end;
So, die oben genannten Methoden machen irgendetwas (ist ja jetzt erstmal egal was). Tatsache ist aber, dass sie zwei unterschiedliche Parameterlisten haben und und unterschiedliche typen zurückgeben.
Mein Ansatz bisher war wie folgt:

Delphi-Quellcode:
procedure DoSomething(Method: Pointer);
begin
  //...
  asm
    CALL [Method]
  end;
  //...
end;
Aufrufen tue ich das ganze dann wie folgt:

Delphi-Quellcode:
DoSomething(@Add);
DoSomething(@Euler);
Beifügen sollte ich evl. noch, dass sowohl die eingabeparameter als auch die ausgegebenen Werte nicht weiter von belangen sind. Dass die einzelne Methode also nur "schrott" ausgeben kann, wenn man ihre Parameter nicht definiert, dürfte klar sein.

MfG
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Anonyme methode als Parameter übergeben

  Alt 4. Jul 2015, 17:26
Du kannst alles in eine Standard Anonyme Methode wrappen:
Delphi-Quellcode:
procedure DoSomething( AProc: TProc);
begin
  AProc();
end;

procedure Foo;
begin

  DoSomething(
    procedure
    var
      c: Integer;
    begin
      Add(4,5,c);
    end );

  DoSomething(
    procedure
    begin
      Euler();
    end );

end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
488 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Anonyme methode als Parameter übergeben

  Alt 5. Jul 2015, 04:32
Cool, danke!
Probier ich nachher mal aus!

mfG
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Anonyme methode als Parameter übergeben

  Alt 5. Jul 2015, 08:17
Für unsere Skriptsprache brauchte ich etwas Ähnliches. Dort ging es darum, dass es eine Funktion gibt, die eine DLL-Funktion aufruft und Parameter und Typen der Parameter mitgibt. Diese habe ich dann in ein Array von TVarData gepackt und dieses Array an eine in Assembler geschriebene Funktion übergeben, die dann diese beliebigen Parameter genommen und an die angegebene Funktion übergeben hat. Diese Funktion ist natürlich in Assembler geschrieben, aber das habe ich dann für x86, x64 und ARM umgesetzt.

Eine ähnliche Funktion hat Delphi selbst aber glaube ich auch schon... ich glaube in der Unit Rtti oder so...
Sebastian Jänicke
AppCentral
  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 08:53 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