瀏覽代碼

* Example for QuickEvaluate, and some fixes to errorhandling of QuickEvaluate

git-svn-id: trunk@18204 -
marco 14 年之前
父節點
當前提交
1fb6fd25af
共有 3 個文件被更改,包括 46 次插入17 次删除
  1. 12 0
      packages/symbolic/examples/easyevalexample.pp
  2. 2 0
      packages/symbolic/src/exprstrs.inc
  3. 32 17
      packages/symbolic/src/symbolic.pas

+ 12 - 0
packages/symbolic/examples/easyevalexample.pp

@@ -36,4 +36,16 @@ begin
   // variable names are case sensitive!
   // variable names are case sensitive!
   writeln(s,'=',QuickEvaluate(s,['A','B'],[a,b]):10:1,' with A=',a:0:1,' and B=',b);
   writeln(s,'=',QuickEvaluate(s,['A','B'],[a,b]):10:1,' with A=',a:0:1,' and B=',b);
 
 
+ // now let's do that again, but add a symbol (C) that we don't define:
+
+ try
+   a:=2.0;
+   b:=3;
+   s:='(5+A+10)*B+C';
+   // variable names are case sensitive!
+   writeln(s,'=',QuickEvaluate(s,['A','B'],[a,b]):10:1,' with A=',a:0:1,' and B=',b);
+ except
+   on E:Exception do
+     Writeln('An exception occured: ',e.message);
+   end;
 end.
 end.

+ 2 - 0
packages/symbolic/src/exprstrs.inc

@@ -15,6 +15,8 @@
  **********************************************************************}
  **********************************************************************}
 
 
 resourcestring
 resourcestring
+   SEvalUnknownParameterType='QuickEvaluate: unknown variable type for parameter "%s".';
+   SEvalUndefinedVar	    ='QuickEvaluate: No value for parameter "%s".';
    SEvalIE                  ='TEvaluator: Internal Error: ';
    SEvalIE                  ='TEvaluator: Internal Error: ';
    SEvalStackDepthExceeded  ='TEvaluator: Stack depth Evaluate exceeded';
    SEvalStackDepthExceeded  ='TEvaluator: Stack depth Evaluate exceeded';
    SEvalBadNumberOfVars     ='TEvaluator: Invalid number of variables';
    SEvalBadNumberOfVars     ='TEvaluator: Invalid number of variables';

+ 32 - 17
packages/symbolic/src/symbolic.pas

@@ -503,24 +503,39 @@ begin
      VarName:=TStringList.Create;
      VarName:=TStringList.Create;
        try
        try
          Eval:=TEvaluator.Create(Varname,Expr);
          Eval:=TEvaluator.Create(Varname,Expr);
-         if high(variablenames)>0 then
-           begin
-             for i:=low(variablenames) to high(variablenames) do
-               begin
-                 j:=symvars.indexof(variablenames[i]);
-                 if j<>-1 then
-                   begin
-                     case variablevalues[i].vtype of
-                       vtinteger : x:=variablevalues[i].vinteger;
-                       vtextended: x:=variablevalues[i].vextended^;		
-                     else
-                       raise exception.create('unknown parameter type');
-                       end;
-                     Eval.SetConstant(variablenames[i],x);
-                   end;
-               end;
+         try 
+           if high(variablenames)>0 then
+             begin
+               for i:=low(variablenames) to high(variablenames) do
+                 begin
+                   j:=symvars.indexof(variablenames[i]);
+                   if j<>-1 then
+                     begin
+                       case variablevalues[i].vtype of
+                         vtinteger : x:=variablevalues[i].vinteger;
+                         vtextended: x:=variablevalues[i].vextended^;		
+                       else
+                         raise exception.CreateFmt(SEvalUnknownParameterType,[variablenames[i]]);
+                         end;
+                       Eval.SetConstant(variablenames[i],x);
+                       symvars.objects[j]:=tobject(1);
+                       writeln(variablenames[i],'!');
+                     end;
+                 end;
+                 
+             end; 
+           i:=0;
+           while (i<symvars.count) and (symvars.objects[i]=tobject(1)) do inc(i);
+           if i<symvars.count then
+             begin
+               writeln(i, ' ',symvars.count);
+               raise Exception.CreateFmt(SEvalUndefinedVar,[symvars[i]]);
+             end;
+           result:=Eval.Evaluate([]);
+         finally 
+           varname:=nil;
+           eval.free;
            end; 
            end; 
-         result:=Eval.Evaluate([]);
        finally
        finally
          VarName.free;
          VarName.free;
          end
          end