📄 ccompile.cls
字号:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "CCompile"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
'CCompile类
Option Explicit
' //////////////////////////////////////////////////////////////////////////
' // //
' // 数学函数动态编译器CCompile类(由Delphi引入) 作者:侯思松 2003.3.28 //
' // (包括数学函数、布尔运算和定积分函数) //
' // 有改进意见或发现任何错误请转告我,本人不胜感激。 //
' // E-Mail:HouSisong@263.net //
' // ( 转载时请保留本说明:) ) //
' // //
' //////////////////////////////////////////////////////////////////////////
'
'
' ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<///
' /// <<功能简介>>: ///
' /// CCompile可以在程序运行过程中动态完成数学函数表达式字符串的编译执行, ///
' /// (可以带参数,布尔运算,定积分;动态生成机器码执行,不是解释执行)执行速度超快!!! ///
' ///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>///
'
'
' 简要声明:
' 任何用户使用本软件属于个人自愿选择,作者不会对用户使用本软件所引起
' 的对用户的任何形式的损失负责,作者也不承诺提供对本类的维护和服务等义务。
' 本类可以自由拷贝和使用,但必须包含完整的代码和说明,任何修改和用于
' 商业化目的的行为都应该尽量与作者取得联系,并得到授权。
' ( E-Mail: HouSisong@263.net )
'
' 本类的编写目的只是在程序运行过程中能够多次的快速的执行用户输入的
' 数学表达式,程序优化的目标是速度和高精度,所以基本数据类型采用的是80
' 位浮点型,很多地方的处理是以速度为首要目标,这样在计算的准确性和错误
' 处理方面就有所损失。
'
' 作者以前写过一个解释执行数学函数表达式的程序,因为使用到而解释执行太慢了满足不了要求,
' 所以编写了本编译类单元(数学函数动态编译器CCompile类)。
' CCompile可以完成数学函数表达式的动态编译和执行(动态生成机器码),编译后的执行
' 速度比以前解释执行的版本快了5000倍左右!在多次执行和表达式复杂情况下,CCompile在程序
' 执行过程中动态编译的函数执行速度与VC或Delphi6在程序设计阶段静态编译后的函数执行速度
' 相当。
' 测试环境包括:Windows95、Win98、WindowsMe、Windows2000、WindowsXP。
' 测试过的CPU包括:奔腾、赛扬A、奔腾3、赛扬2、奔腾4。
Private cmHandle As Long 'CCompile类句柄
Private Sub Class_Initialize()
cmHandle = 0
cmHandle = cm_CreateTCompile() '创建类
End Sub
Private Sub Class_Terminate()
If cmHandle <> 0 Then
cm_CloseTCmHandle (cmHandle) '释放类
cmHandle = 0
End If
End Sub
' 调用函数返回表达式的值,
Public Function GetValue() As Double
GetValue = VB_cm_GetValue(cmHandle)
End Function
' 调用函数返回表达式的值(实参数值列表), '等价于 SetFunctionParameter + GetValue
Public Function GetFunctionValue(PList() As Double) As Double ' (编译后才能调用)
GetFunctionValue = VB_cm_GetFunctionValue(cmHandle, PList(LBound(PList)))
End Function
' 按当前设置的参数表传入参数值(实参数值列表)
Public Sub SetFunctionParameter(PList() As Double) ' (编译前后都能调用)
Call VB_cm_SetFunctionParameter(cmHandle, PList(LBound(PList)))
End Sub
' 设置需要编译的字符串(要编译的字符串,虚参数列表字符串,是否自动编译),
' 比如 Value ="Sqr(x)+Sqr(y)", ParameterList ="x,y" ,
Public Function SetText(ByVal TextValue As String, _
ByVal ParameterList As String, ByVal IfCompile As Boolean) As Boolean '(编译前调用,这是最先要做的)
SetText = cm_SetText(cmHandle, TextValue, ParameterList, IfCompile)
End Function
' 编译当前字符串
Public Function Compile() As Boolean
Compile = cm_Compile(cmHandle)
End Function
' 测试是否使用了未定义的变量
Public Function IfHaveUnDefineParameter() As Boolean '(编译后才能调用)
IfHaveUnDefineParameter = cm_IfHaveUnDefineParameter(cmHandle)
End Function
'VB不支持10字节浮点数,所以编译类不能和VB环境共享变量,这里只能和另一个编译类共享变量
'(编译前调用,如果是在编译后,需要调用cm_RefreshExeAddressCodeInPointer刷新地址)
Public Function SetExteriorParameter(ByVal PName As String, ByVal PAddress As Long) As Boolean
SetExteriorParameter = cm_SetExteriorParameter(cmHandle, PName, PAddress)
End Function
'刷新变更地址 '(设置完所有的外部变量以后需要调用一次该函数)
Public Sub RefreshExeAddressCodeInPointer()
cm_RefreshExeAddressCodeInPointer (cmHandle)
End Sub
' 处理预定义宏(要代换的标识符,代换为的描述字符串), ' 可以用来处理常数,甚至定义新的函数!
' 如 Key as ='a', Value as ='-0.5' , 或 Key as ='f(x,y)',Value as ='Max(x,Sin(y))' 等,
Public Function Define(ByVal Key As String, Value As String) As Boolean '(编译前调用)
Define = cm_Define(cmHandle, Key, Value)
End Function
' 处理常数定义(要代换的标识符,代换的值) ' 常数定义, Value必须是一个可计算的值
' 如 Key as ='a', Value as ='2' , 或 Key as ='b' , Value as ='2*sin(PI/2)' 等,
' 该功能完全可以用预定义宏(Define)来代替,
' 但当值为常数时这样处理有可能使最后得到的编译函数速度更快,并加快编译速度
Public Function DefineConst(ByVal Key, Value As String) As Boolean '(编译前调用)
DefineConst = cm_DefineConst(cmHandle, Key, Value)
End Function
'根据参数名称PName得到参数地址值
Public Function GetParameterAddress(ByVal PName As String) As Long
GetParameterAddress = cm_GetParameterAddress(cmHandle, PName)
End Function
'按参数名称PName设置参数值dValue
Public Function SetParameterN(ByVal PName As String, ByVal dValue As Double) As Boolean
SetParameterN = VB_cm_SetParameterN(cmHandle, PName, dValue)
End Function
'按参数地址PAddress设置参数值dValue
Public Sub SetParameterA(ByVal PAddress As Long, ByVal dValue As Double)
Call VB_cm_SetParameterA(cmHandle, PAddress, dValue)
End Sub
'得到参数PName的值
Public Function GetParameterValueN(ByVal PName As String) As Double
GetParameterValueN = VB_cm_GetParameterValueN(cmHandle, PName)
End Function
'得到参数PName的值
Public Function GetParameterValueA(ByVal PAddress As Long) As Double
GetParameterValueA = VB_cm_GetParameterValueA(PAddress)
End Function
'得到参数的总数目(不包括常数)
Public Function GetUserParameterCount() As Long
GetUserParameterCount = cm_GetUserParameterCount(cmHandle)
End Function
'通过PList返回参数列表(不包括常数)
'Public Sub GetUserParameterList(PList() As cm_TUserParameterList)
' GetUserParameterList = cm_GetUserParameterList(cmHandle, PList(0)) '数组下表应该从0开始,如果不是请改写
'End Sub
'测试参数PName是否已经存在
Public Function IfHaveParameter(ByVal PName As String) As Boolean
IfHaveParameter = cm_IfHaveParameter(cmHandle, PName)
End Function
'设置随机函数Rnd()的初始种子值为完全随机种子(系统用当前精确到毫秒的时间设置)
Public Sub SetRandomizeT()
Call cm_SetRandomizeT(cmHandle)
End Sub
'设置随机函数Random()的初始种子值
Public Sub SetRandomizeI(ByVal RandomSeed As Integer)
Call cm_SetRandomizeI(cmHandle, RandomSeed)
End Sub
Public Sub SetEnabledNote(ByVal Value As Boolean) '是否允许使用注释 (默认false)
Call cm_SetEnabledNote(cmHandle, Value)
End Sub
Public Sub SetEnabledOptimizeDiv(ByVal Value As Boolean) '是否要优化常数浮点除法运算 (默认true)
Call cm_SetEnabledOptimizeDiv(cmHandle, Value)
End Sub
Public Sub SetEnabledOptimizeStack(ByVal Value As Boolean) '是否要优化堆栈 (默认true)
Call cm_SetEnabledOptimizeStack(cmHandle, Value)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -