Einzelnen Beitrag anzeigen

Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Prozedur per Pointer aufrufen

  Alt 22. Dez 2011, 13:32
Ich habe ein Pointer Array:
Delphi-Quellcode:
 
FunktionsMR = Array [0..65535] of Pointer;
Die variable wird so deklariert

Delphi-Quellcode:

FunktionMR : funktionsMR;
Im Index 52880 kommt ein Pointer von einer Prozedur:

Delphi-Quellcode:

FunktionMR[52880] := @_StringSplit;
Stehen in dem Array nur Prozeduren drin oder auch andere Werte?

Zitat von romy:
Delphi-Quellcode:
TMethod(Event).Code := FunktionMR[52880];
TMethod(Event).Data := Self;
Button1.OnClick := Event;
Button1.Click;
das hat aber zu Problemen geführt und außerdem sollte das eine non GUI Anwendung, darum bin ich auf diese Methode umgestiegen
Das ist auch nicht gut, was du da machst, da
1. beim Code einer TMethod noch der Self Parameter versteckt mit übergeben wird und den deine Prozedur nicht berücksichtigt, da sie keine Methode einer Klasse ist (=> Probleme mit Stack und/oder Registern)
2. OnClick erwartet eine Methode, welchen eine Parameter enthält und übergibt diesen auch freudig (=> ähnliches Problem wie bei 1.)

Delphi-Quellcode:

Call(FunktionMR[52880]);
Probier doch mal

Delphi-Quellcode:
TProcedure(FunktionMR[52880])();
// die Klammern am Ende sind bei Free Pascal im Modus ObjFPC nötig,
// damit der Compiler weiß, dass es sich um einen Prozedurenaufruf handelt
Zitat von romy:
die Call Prozedur sieht so aus:

Delphi-Quellcode:

procedure Call(dummy: pointer);
var
x : pointer;
begin
x := dummy;
asm
CALL x //<----- chrash
end;
end;
Nun ist es aber so ich kann das ganze mit dem pointer FunktionMR[52880] genau einmal aufrufen dann chrasht mir alles zusammen.
Einen Prozeduraufruf per Assembler würde ich an deiner Stelle nur durchführen, wenn ich mich vorher ein wenig mit Calling Conventions und ähnlichem beschäftigt hätte (und selbst dann nur mit äußerster Vorsicht).

Zitat von romy:
Wieso ist das so, mache ich was falsch oder kann ich das ganze irgendwie besser verpacken?
Siehe meinen Vorschlag oben. Vielleicht möchtest du dich auch ein wenig zum Thema Prozedurvariablen belesen. Dazu verweise ich dich einfach mal hier zur Dokumentation von Free Pascal (nur in Englisch, ich hoffe das macht nichts).

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat