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