Hi zusammen!
Ich versuche derzeit mit PascalScript ein Pascalprogramm aus unserem Mathebuch ein wenig flexibler zu gestalten und habe deswegen zwei wichtige Funktionen in eine ScriptDatei ausgelagert:
Delphi-Quellcode:
function F(x:Single):Single;
begin
Result:=x*(x*x-4)+1;
end;
function GetDescription:String;
begin
Result:='f:x->x^3-4*x+1';
end;
Erstere Funktion liefert für x den passenden Funktionswert und die zweite liefert einfach einen Beschreibungsstring der Funktion.
Jetzt hab ich die Funktionen mit TPSScript.OnVerifyProc importiert und feststellen müssen, dass es im "Tutorial" auf der
RemObjects Homepage eine Eigenschaft bei TPSInternalProcedure gibt, die bei mir nicht existiert; nämlich TPSInternalProcedure.aExport und das dazugehörige etExportDecl.
Die zweite Funktion läuft ohne Probleme, doch bei der ersten bekomm ich eine 'Invalid floating point operation', sobald ich sie aufrufe... Meine Vermutung ist jetzt, dass es an dem fehlenden aExport liegt...
Hier noch der wichtigste Code, falls es doch an mir scheitert
:
Delphi-Quellcode:
type
TF=function(x:Single):Single
of object;
TGetDescription=function:
String of object;
procedure TMainForm.ScriptVerifyProc(Sender: TPSScript;
Proc: TPSInternalProcedure;
const Decl:
string;
var Error: Boolean);
begin
if Proc.
Name = '
F'
then begin
if not ExportCheck(Sender.Comp, Proc,
[btSingle, btSingle], [pmIn])
then begin
Sender.Comp.MakeError('
', ecCustomError, '
Funktionskopf von F stimmt nicht mit F(x:Single):Single überein.');
Error := True;
end
else begin
// Proc.aExport := etExportDecl;
Error := False;
end;
end else
if Proc.
Name = '
F'
then begin
if not ExportCheck(Sender.Comp, Proc,
[btString], [])
then begin
Sender.Comp.MakeError('
', ecCustomError, '
Funktionskopf von GetDescription stimmt nicht mit GetDescription:String überein.');
Error := True;
end
else begin
Error:=FALSE;
end;
end
else
Error := False;
end;
//Hier noch das wichtigste des OnClick-Events vom StartButton
procedure TMainForm.ComputeClick(Sender:TObject);
var
F:TF;
GetDescription:TGetDescription;
a,b,m,e:Single;
begin
//Script ist die TPSScript Komponente
if Script.Compile
then begin
F:=TF(Script.GetProcMethod('
F'));
if @F=NIL
then begin
ShowMessage('
Funktion F(x:Single):Single konnte nicht importiert werden');
Exit;
end;
GetDescription:=TGetDescription(Script.GetProcMethod('
GetDescription'));
if @GetDescription=NIL
then begin
ShowMessage('
Funktion GetDescription:String konnte nicht importiert werden');
Exit;
end;
//Hier hab ich ein paar Typkonvertierungen mal weggelassen ;)
repeat
if F(a)*F(m)<=0
then //<--- Hier die Exception
b:=m
else
a:=m;
Application.ProcessMessages;
until Abs(F(m))<e;
//auch die Ausgabe der Werte hab ich mir jetzt mal gespart :D
end;
end;
Ich hoff mal, ihr wisst ne Lösung...
PS: Es geht um den Nullstellensatz bezüglich globalen Aussagen bei Funktionen (Infinitesimalrechnung, 11. Klasse)