Einzelnen Beitrag anzeigen

Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#1

Problem mit importierter Funktion aus PascalScript

  Alt 3. Feb 2006, 15:07
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 = 'Fthen 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 = 'Fthen 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)
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat