AGB  ·  Datenschutz  ·  Impressum  







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

Zugriffsverletzung nach end;

Ein Thema von Baal03 · begonnen am 8. Aug 2016 · letzter Beitrag vom 1. Jun 2017
Antwort Antwort
Baal03

Registriert seit: 27. Apr 2016
3 Beiträge
 
#1

Zugriffsverletzung nach end;

  Alt 8. Aug 2016, 11:39
Delphi-Version: XE8
Hallo,

Ich versuche derzeit die DLL der GSL - GNU Scientific Library in Delphi zu verwenden.
Als kleines Testprogramm möchte ich die komplexen Zahlen verwenden.

In einer .pas-Datei binde ich die DLL ein mit

Delphi-Quellcode:
interface

type
    // Complex Numbers
    gsl_complex = record
      dat: Array [0..1] of double;
    end;

   // This function uses the rectangular Cartesian components (x,y) to return the complex
   // number z = x + iy. An inline version of this function is used when HAVE_INLINE is defined.
   function gsl_complex_rect (x: double; y: double): gsl_complex ; cdecl;

   // This function returns the complex number z = r exp(iθ) = r(cos(θ) + i sin(θ)) from
   // the polar representation (r,theta).
   function gsl_complex_polar (x: double ; theta: double): gsl_complex ; cdecl;


implementation

   function gsl_complex_rect ( x: double; y: double): gsl_complex ; cdecl; external gsl_dll;

   function gsl_complex_polar ( x: double ; theta: double): gsl_complex ; cdecl; external gsl_dll;


end.


in der main verwende ich diese Funktionen mit

Delphi-Quellcode:
procedure TForm2.SpeedButton3Click(Sender: TObject);
var
Z1: gsl_complex;
Z2: gsl_complex;
begin
Z1 := gsl_complex_polar (StrToFloat(Edit_r.Text), (PI/180)*StrToFloat(Edit_theta.Text));
Z2 := gsl_complex_rect (StrToFloat(Edit_X.Text), StrToFloat(Edit_Y.Text));
end;

Beim Ausführen bekomme ich nach dem "end;" des Button die Fehlermeldung

Code:
Exception der Klasse $C0000005 mit der Meldung 'Access Violation at 0x0000000 read of adress 0x0000000' aufgetreten
Ich vermute mal das soll heißen das er auf ein Nullzeiger zugreifen will.

Gucke ich mir die Rückgabewerte der Funktionen im Debugger an, geben die Funktionen die richtigen Werte zurück.

Verwende ich nur eine komplexe Zahl, wie folgt mit andren komplexen Funktion der DLL kommt keine Fehlermeldung.

Delphi-Quellcode:
procedure TForm2.SpeedButton1Click(Sender: TObject);
var
  Z2: gsl_complex;
begin

Z2 := gsl_complex_rect (StrToFloat(Edit_X.Text), StrToFloat(Edit_Y.Text));

Edit_arg.Text := FloatToStr(gsl_complex_arg(Z2));
Edit_abs.Text := FloatToStr(gsl_complex_abs(Z2));
Edit_abs2.Text := FloatToStr(gsl_complex_abs2(Z2));
Edit_logabs.Text := FloatToStr(gsl_complex_logabs(Z2));

end;
oder

Delphi-Quellcode:
procedure TForm2.SpeedButton3Click(Sender: TObject);
var
X : Double;
Z1: gsl_complex;
Z2: gsl_complex;
begin
Z1 := gsl_complex_rect (StrToFloat(Edit_r.Text), (PI/180)*StrToFloat(Edit_theta.Text));
Z2:=gsl_complex_add(Z1,Z1);
X:=GSL_REAL(Z2);
Edit_add.Text :=FloatToStr(X);
end;

Daher vermute ich das mehrfahre aufrufen von "gsl_complex_rect" bzw. "gsl_complex_rect" in einer Prozedur zu dem Fehler führt

Definiere ich Z1 und Z2 global kann ich die "gsl_complex_rect" bzw. "gsl_complex_rect" 2 mal aufrufen, jedoch dann keine weitere Funktion mehr ohne das die Fehlermeldung kommt.


Ich habe mir bereits das Thema Zugriffsverletzungen durch gelesen, es half mir jedoch nicht weiter.

Vielen Dank
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zugriffsverletzung nach end;

  Alt 8. Aug 2016, 12:19
Das wird so nicht funktionieren. Rückgabewerte von Funktionen sind compilerabhängig sobald Structs etc ins Spiel kommen.
Das einzige was Du machen kannst ist eine wrapper Dll in c zu schreiben die Dir die Rückgabe als Parameter erlaubt also so etwas wie

 function gsl_complex_rect (x: double; y: double; var result gsl_complex): integer ; cdecl;
Aus einer Dll heraus funktionieren in der Regel nur einfache Typen wie integer, double etc.
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zugriffsverletzung nach end;

  Alt 8. Aug 2016, 14:10
Jupp, Delphi wandelt derartige "Results" in einen Var-Parameter um, sobalt der Typ größer als ein Integer ist.
Intern wird dann aus function gsl_complex_rect(x, y: double): gsl_complex; ein procedure gsl_complex_rect(x, y: double; var Result: gsl_complex); .

Und packed record statt record , dann ist schonmal das Align nicht mehr compiler/settings-abhängig.

Und es dürfen auch niemals compilerabhängige Typen in solchen modulübergreifenden Typen/Records vorhanden sein.
$2B or not $2B

Geändert von himitsu ( 8. Aug 2016 um 14:27 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Zugriffsverletzung nach end;

  Alt 8. Aug 2016, 15:01
Hallo,
vielleicht ist es ja nicht cdecl sondern stdcall?

OK, ist cdecl

Schau mal hier (Kapitel 5).
ftp://ftp.freepascal.org/fpc/docs-pdf/CinFreePascal.pdf

Ist zwar FreePascal, aber ier sollte das das gleiche sein.

Heiko
Heiko

Geändert von hoika ( 8. Aug 2016 um 15:07 Uhr)
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Zugriffsverletzung nach end;

  Alt 1. Jun 2017, 17:33
Falschpost - sorry!
Hans-Georg Bothur
www.hermann-juergensen.de

Geändert von H.Bothur ( 1. Jun 2017 um 17:35 Uhr)
  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 06:07 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