Einzelnen Beitrag anzeigen

Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#1

Problem mit ProcedurPointer: Access violation

  Alt 14. Mai 2022, 14:48
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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (14. Mai 2022 um 15:51 Uhr)
  Mit Zitat antworten Zitat