Hallo Community,
verschiedene Berechnungsfunktionen z.B. MyFunk_1 rufe ich über Procedurpointer auf:
Delphi-Quellcode:
Type
TDynExtendedVektor = TArray<Extended>;
TFuncProc = Procedure (X : Extended;
CONST Koeff_Vektor : TDynExtendedVektor;
VAR Y: Extended;
VAR dYdKoeff_Vektor: TDynExtendedVektor);
Procedure MyFunk_1(X: Extended; CONST Koeff_Vektor: TDynExtendedVektor;
VAR y: Extended;
VAR dYdKoeff_Vektor: TDynExtendedVektor);
VAR
a : TDynExtendedVektor ABSOLUTE Koeff_Vektor;
dyda : TDynExtendedVektor ABSOLUTE dYdKoeff_Vektor;
Z, S, T: Extended;
Begin
Z := a[1] + X;
S := -1/a[2];
T := -(1 + a[2])/a[2];
dyda[0]:= Power(Z, S);
y := a[0]*dyda[0];
dyda[1]:= -a[0]*Power(Z, T)/a[2];
dyda[2]:= y*Ln(Z)/Sqr(a[2]);
End;{MyFunk_1}
{------------}
Procedure Berechnung(x: Extended; CONST Koeff_Vektor: TDynExtendedVektor,
VAR y: Extended;
VAR Abl_Vektor: TDynExtendedVektor;
MyFuncPtr: TFuncProc);
Begin
MyFuncPtr(X, Koeff_Vektor, y, Abl_Vektor);
End;{Berechnung}
{--------------}
VAR
MyFuncPtr: TFuncProc;
x, y : Extended;
Abl_Vektor: TDynExtendedVektor)
Begin
...
MyFuncPtr:= MyFunk_1;
Berechnung(x, Koeff_Vektor, y, Abl_Vektor, MyFuncPtr);
...
Das funktioniert ohne Probleme, solange sich die Procedure MyFunk_1 im Hauptprogramm (.dpr) befindet. Aber ich habe eine größere Anzahl solcher Berechnungsfunktionen in einer Separaten
Unit gesammelt, nennen wie sie einfach
Funktionen_Unit.pas
Wenn ich nun die Berechnung aus dieser
Unit heraus starte:
Delphi-Quellcode:
MyFuncPtr:= Funktionen_Unit.MyFunk_1;
Berechnung(x, Koeff_Vektor, y, Abl_Vektor, MyFuncPtr);
erhalte ich die Fehlermeldung:
Eine Exception der Klasse $C0000005
mit der Meldung 'access violation at 0x00405349: read of adress 0xfbbfe024' aufgetreten
Das Programm hält an in: Embarcadero Delphi Memory Manager GETMEM.inc
Anweisungszeile:
{Get the new first free block}
and ecx, [eax - 4]
Was mache ich falsch?
Danke & Grüße
Andreas