Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit ProcedurPointer: Access violation (https://www.delphipraxis.net/210581-problem-mit-procedurpointer-access-violation.html)

Andreas13 14. Mai 2022 13:48

Problem mit ProcedurPointer: Access violation
 
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

peterbelow 14. Mai 2022 14:55

AW: Problem mit ProcedurPointer: Access violation
 
Zitat:

Zitat von Andreas13 (Beitrag 1505796)
Hallo Community,
verschiedene Berechnungsfunktionen z.B. MyFunk_1 rufe ich über Procedurpointer auf:
[DELPHI]
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;


Was mache ich falsch?

Du verwendest "absolute" ohne jede Notwendigkeit, nur um etwas Tipparbeit zu sparen. Böser Andreas :wink:
Versuchs mal ohne.

Andreas13 14. Mai 2022 15:23

AW: Problem mit ProcedurPointer: Access violation
 
Danke Peter, aber auch ohe ABSOLUTE bleibt die Access violation erhalten.
Andreas

Andreas13 14. Mai 2022 15:39

AW: Problem mit ProcedurPointer: Access violation
 
Hallo Peter,
jetzt habe ich den Fehler gefunden: Es hat nichts mit der Auslagerung der Funktion zu tun.
Die Access violation kam von SetLength(Vektor), weil ich in einer ausgelagerten Tabelle der Berechnungs-Funktionen eine falsche Parameteranzahl eingetragen hatte :wall:
Ich schäme mich! :oops:
Danke für Deine Hilfe!
Viele Grüße, Andreas

Rolf Frei 14. Mai 2022 15:57

AW: Problem mit ProcedurPointer: Access violation
 
Meinen Kommentar gelöscht, weil du das Problem anscheinend gelöst hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz