Hallo miteinander,
Ich bin neu hier im Forum und ca. seit einem halben Jahr mit Delphi beschäftigt
.
Nun zu meinem Problem, bei dem ich einfach nicht weiter komme.
Ich habe in meinem Delphi-Programm eine .dll (Numerik-Bibliothek) eingebunden, die in AnsiC erstellt wurde.
Im Benutzerhandbuch der
dll ist die Funktion definiert:
Code:
int newt ( int n,
double x[],
int f( double x[], double y[]),
int jaco( double x[], double *
df[]),
int kmax,
int prim,
char *pfile,
double fval[],
int *anziter,
double eps
);
mit folgender Beschreibung zu jaco:
"int jaco( double x[], double *
df[])
Funktion zur Berechnung der Jacobi–Matrix. Bei Vorgabe des Vektors x werden die Werte der partiellen Ableitungen der Funktion f nach den Komponenten von x berechnet und in der n × n–Matrix
df abspeichert."
Als Übergabeparameter übergebe ich der Funktion (newt) meine Funktion jaco:
Code:
function Jac(var x: Tarray; var
df: TMatrix) : integer; cdecl;
begin
df[0][0]^ := x[0] / 2 + 1;
df[0][1]^ := 2 * x[1] / 5;
df[1][0]^ := x[0] / 2;
df[1][1]^ := x[1] + 1;
result := 0;
end;
Die Typdeklarationen von Tarray und TMatrix sind folgendermaßen:
Code:
Tarray = array[0..1] of double;
TMatrix = array[0..1,0..1] of Pdouble;
die
dll-Funktion newt übergibt mir also mit der variablen
df ein Speicherstellen der Matrix, die ich mit
df[][]^ beschreiben will (Wert zuweisen).
Mein Problem ist, dass die Speicherstellen von df[1][0] und df[1][1] so aussehen:
$ABABABAB und eine Fehlermeldung kommt, wenn ich darauf schreiben will.
Die Speicherstellen von
df[0][0] und
df[0][1] werden von der
dll korrekt übergeben, zb.: $263BC8....
Wenn ich mir über einen Pointer die Adresse anzeigen lassen z.B. @
df[1][0], bekomme ich eine vermeidlich korrekte Adresse (ähnlich wie von
df[0][0] und
df[0][1]). Wenn ich aber die Matrix über diese Adresse beschreibe, mag das meine
dll-Funktion nicht.
Leider kenne ich mich in C mit der Speicherverwaltung nicht aus, sodass ich auf eure Hilfe angewiesen bin.
Hier noch die C-Codestelle, bei der der Speicher für diese Matrix reserviert wird:
Code:
/* Speicher fuer Jacobi Matrix */
jmat = (REAL **)vmalloc(vmblock, MATRIX, n, n);
Vielen Dank im Voraus für eure Hilfe!
Gruß Johannes