Hi everyone,
I'm trying to use your ode solver in Delphi. And I have one question about the function in your XALGLIB.pas file. In you manual, you have the following example:
program XTestALGLIB; {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$APPTYPE CONSOLE}
uses SysUtils, Classes, Math, XALGLIB; procedure ode_function_1_diff(const y: TVector; x: Double; dy: TVector; obj: Pointer); begin // // This callback calculates f(y[],x)=-y[0] // // An additional parameter obj may be used to pass some data to this // callback (if you pass some pointer value as obj parameter of // optimizer method, it will forward this pointer to callback). // // IMPORTANT: you should NOT overwrite dy parameter by another // instance of TVector array: say, you should not write // code like ";SetLength(dy,N)". // // The reason is that dy points to preallocated array; // if you reallocate it, optimizer will have no way of // finding out reference to new array. // // Thus, you should work with dy parameter without // reallocation/reinitializing it. // dy[0] := -y[0]; end;
var y: TVector; x: TVector; eps: Double; h: Double; s: Todesolverstate; m: TALGLIBInteger; xtbl: TVector; ytbl: TMatrix; rep: Todesolverreport;
begin s:=nil;
y:=Str2Vector('[1]'); x:=Str2Vector('[0, 1, 2, 3]'); eps:=0.00001; h:=0; odesolverrkck(y, x, eps, h, s); odesolversolve(s, ode_function_1_diff, nil); odesolverresults(s, m, xtbl, ytbl, rep); WriteLn(Format('%d', [m])); // EXPECTED: 4 WriteLn(Format('%s', [FormatVector(xtbl,2)])); // EXPECTED: [0, 1, 2, 3] WriteLn(Format('%s', [FormatMatrix(ytbl,2)])); // EXPECTED: [[1], [0.367], [0.135], [0.050]]
FreeAndNil(s);
ReadLn; ExitCode:=0; end.
The Diff function has an input obj, I'm trying to pass some parameter to this pointer but I got some 'c0000005 ACCESS_VIOLATION' error at this step. Can anyone explain how to use this obj to pass some parameter from outside of the function? Thank you very much!!
Sincerely, AKA
|