![]() |
Delphi-Version: XE8
Zugriffsverletzung nach end;
Hallo,
Ich versuche derzeit die DLL der ![]() 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:
Ich vermute mal das soll heißen das er auf ein Nullzeiger zugreifen will.
Exception der Klasse $C0000005 mit der Meldung 'Access Violation at 0x0000000 read of adress 0x0000000' aufgetreten
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:
oder
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;
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 ![]() Vielen Dank |
AW: Zugriffsverletzung nach end;
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
Delphi-Quellcode:
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. |
AW: Zugriffsverletzung nach end;
Jupp, Delphi wandelt derartige "Results" in einen Var-Parameter um, sobalt der Typ größer als ein Integer ist.
Intern wird dann aus
Delphi-Quellcode:
ein
function gsl_complex_rect(x, y: double): gsl_complex;
Delphi-Quellcode:
.
procedure gsl_complex_rect(x, y: double; var Result: gsl_complex);
Und
Delphi-Quellcode:
statt
packed record
Delphi-Quellcode:
, dann ist schonmal das Align nicht mehr compiler/settings-abhängig.
record
Und es dürfen auch niemals compilerabhängige Typen in solchen modulübergreifenden Typen/Records vorhanden sein. |
AW: Zugriffsverletzung nach end;
Hallo,
vielleicht ist es ja nicht cdecl sondern stdcall? OK, ist cdecl Schau mal hier (Kapitel 5). ![]() Ist zwar FreePascal, aber ier sollte das das gleiche sein. Heiko |
AW: Zugriffsverletzung nach end;
Falschpost - sorry!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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