“數學函數動態編譯器TCompile類”的bug跟蹤、新版源代碼下載
[email protected] 2007.06.17
tag: 函數動態編譯,TCompile,勝天財務進銷存
2002年的時候在網上共享了“數學函數動態編譯器TCompile類”,它可以在程
序運行過程中動態完成數學函數表達式字符串的編譯執行(動態生成機器碼執行,
不是解釋執行);從那以後代碼就很少更新了;而最近來郵件詢問這個庫的人越來
越多起來;
網上查詢了一下,發現“TCompile類”被《...Delphi優秀
免費資源》文章收錄;網上有名的開放源代碼的《勝天財務進銷存》收錄(其中
的Compile_Calc.pas單元); ...
很多人已經把它使用到了一些關鍵的計算領域,所以就有了這篇文章;
"數學函數動態編譯器TCompile類"是我在學習Delphi的過程中寫的,
命名、代碼風格和框架設計都不是很好,當時寫它的首要需求是快速的計算;
建議現在在使用這個類的用戶下載最新版本的TCompile類的源代碼;
(由於源代碼有7千多行,就不貼在該文章裏了 見文章後面的下載鏈接)
(新版本默認使用Double數據類型,如果需要兼容以前的Extended類型,需要把
//{$DEFINE FloatType_Single}
{$DEFINE FloatType_Double}
//{$DEFINE FloatType_Extended}
這幾行改寫爲:
//{$DEFINE FloatType_Single}
//{$DEFINE FloatType_Double}
{$DEFINE FloatType_Extended}
)
對於用於關鍵性計算領域的用戶建議關閉TCompile的優化(屬性EnabledOptimizeDiv/
EnabledOptimizeStack/EnabledOptimizeConst都設置爲false)
用戶如果遇到TCompile類的bug請給個回帖或發郵件給我,我會把bug和修正情況在該文章中更新;
附:
“數學函數動態編譯器TCompile類”的使用Demo:
var
Compilation : TCompile; // 聲明Compilation爲數學函數動態編譯器TCompile類的實例
str : string;
xValue : TCmxFloat;
begin
Compilation:=TCompile.Create; //創建類
try
str:='x+sin(y*PI/2)*3';
Compilation.SetText(str); //str爲要求值的數學表達式字符串
......
//如果有參數,可以獲得參數地址,並賦值 (默認值爲0)
//如: PTCmxFloatX:=Compilation.GetParameterAddress('x');
//如: PTCmxFloatY:=Compilation.GetParameterAddress('y');
// PTCmxFloatX^:=1.5;
// PTCmxFloatY^:=0.5;
//也可以一次獲得所有的參數列表:Compilation.GetParameterList(PList);
......
xValue:=Compilation.Value; //獲得表達式的值,
//可以多次改變參數值並多次調用(如放在循環中),這樣才能顯示出效率:)
......
finally
Compilation.Free; //釋放類
end;
end;
最新的“數學函數動態編譯器TCompile類”源代碼下載:
http://download.csdn.net/source/202002
(TCompile類在"Compile/SDK/Delphi/Compile_Hss.pas"文件)
bug和修正列表:
2005.08.05更新
-- 已知使用最早發佈的TCompile的代碼Power函數(指數函數)的實現有一個優化錯誤,該錯誤發生在Power(B,N),當B是一個帶參數的表達式,而N屬於[0,1,2],並且EnabledOptimizeConst屬性爲打開狀態的情況下;