📄 ccompilecomplex.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 = "CCompileComplex"
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"
'CCompileComplex类
Option Explicit
' /////////////////////////////////////////////////////////////////////////////////
' // //
' // 复数函数动态编译器CCompileComplex类(由Delphi引入) 作者:侯思松 2003.3.29 //
' // (包括数学函数、布尔运算等函数) //
' // 有改进意见或发现任何错误请转告我,本人不胜感激。 //
' // E-Mail:HouSisong@263.net //
' // ( 转载时请保留本说明:) ) //
' // //
' /////////////////////////////////////////////////////////////////////////////////
'
'
' ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<///
' /// <<功能简介>>: ///
' /// CCompileComplex可以在程序运行过程中动态完成复学函数表达式字符串的编译执行, ///
' /// (可以带参数,布尔运算;动态生成机器码执行,不是解释执行)执行速度超快!!! ///
' ///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>///
'
'
' 简要声明:
' 任何用户使用本软件属于个人自愿选择,作者不会对用户使用本软件所引起
' 的对用户的任何形式的损失负责,作者也不承诺提供对本类的维护和服务等义务。
' 本类可以自由拷贝和使用,但必须包含完整的代码和说明,任何修改和用于
' 商业化目的的行为都应该尽量与作者取得联系,并得到授权。
' ( E-Mail: HouSisong@263.net )
'
' 本类的编写目的只是在程序运行过程中能够多次的快速的执行用户输入的
' 数学表达式,程序优化的目标是速度和高精度,所以内部基本数据类型采用的
' 是80位浮点型,很多地方的处理是以速度为首要目标,这样在计算的准确性和
' 错误处理方面就有所损失。
'
' 测试环境包括:Windows95、Win98、WindowsMe、Windows2000、WindowsXP。
' 测试过的CPU包括:奔腾、赛扬A、奔腾3、赛扬2、奔腾4。
Private cmcxHandle As Long 'CCompileComplex类句柄
Private Sub Class_Initialize()
cmcxHandle = 0
cmcxHandle = cmcx_CreateTCompileComplex() '创建类
End Sub
Private Sub Class_Terminate()
If cmcxHandle <> 0 Then
cmcx_CloseTCmcxHandle (cmcxHandle) '释放类
cmcxHandle = 0
End If
End Sub
' 调用函数返回表达式的值(实参数值列表p0.Real,p0.Imag,p1.Real,p1.Imag...), '等价于 SetFunctionParameter + GetValue
Public Sub GetFunctionValue(PList() As Double, ByRef ComplexReal As Double, ByRef ComplexImag As Double) ' (编译后才能调用)
Call VB_cmcx_GetFunctionValue(cmcxHandle, PList(LBound(PList)), ComplexReal, ComplexImag)
End Sub
' 调用函数返回表达式的值,
Public Sub GetValue(ByRef ComplexReal As Double, ByRef ComplexImag As Double) '(编译后才能调用)
Call VB_cmcx_GetValue(cmcxHandle, ComplexReal, ComplexImag)
End Sub
' 按当前设置的参数表传入参数值(实参数值列表p0.Real,p0.Imag,p1.Real,p1.Imag...)
Public Sub SetFunctionParameter(PList() As Double) ' (编译前后都能调用)
Call VB_cmcx_SetFunctionParameter(cmcxHandle, PList(LBound(PList)))
End Sub
' 设置需要编译的字符串(要编译的字符串,虚参数列表字符串,是否自动编译),
' 比如 as Value as ='Sqr(x)+Sqr(y)', ParameterList as ='x,y' ,
Public Function SetText(ByVal TextValue As String, _
ByVal ParameterList As String, ByVal IfCompile As Boolean) As Boolean '(编译前调用,这是最先要做的)
SetText = cmcx_SetText(cmcxHandle, TextValue, ParameterList, IfCompile)
End Function
' 编译当前字符串
Public Function Compile() As Boolean
Compile = cmcx_Compile(cmcxHandle)
End Function
' 测试是否使用了未定义的变量
Public Function IfHaveUnDefineParameter() As Boolean '(编译后才能调用)
IfHaveUnDefineParameter = cmcx_IfHaveUnDefineParameter(cmcxHandle)
End Function
'VB不支持10字节浮点数,所以编译类不能和VB环境共享变量,这里只能和另一个编译类共享变量
'(编译前调用,如果是在编译后,需要调用cm_RefreshExeAddressCodeInPointer刷新地址)
Public Function SetExteriorParameter(ByVal PName As String, ByVal PAddress As Long) As Boolean
SetExteriorParameter = cmcx_SetExteriorParameter(cmcxHandle, PName, PAddress)
End Function
'刷新变更地址 '(设置完所有的外部变量以后需要调用一次该函数)
Public Sub RefreshExeAddressCodeInPointer()
cmcx_RefreshExeAddressCodeInPointer (cmcxHandle)
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 = cmcx_Define(cmcxHandle, 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 = cmcx_DefineConst(cmcxHandle, Key, Value)
End Function
'根据参数名称PName得到参数地址值
Public Function GetParameterAddress(ByVal PName As String) As Long
GetParameterAddress = cmcx_GetParameterAddress(cmcxHandle, PName)
End Function
'按参数名称PName设置参数值dValue
Public Function SetParameterN(ByVal PName As String, ByVal ComplexReal As Double, ByVal ComplexImag As Double) As Boolean
SetParameterN = VB_cmcx_SetParameterN(cmcxHandle, PName, ComplexReal, ComplexReal)
End Function
'按参数地址PAddress设置参数值dValue
Public Sub SetParameterA(ByVal PAddress As Long, ByVal ComplexReal As Double, ByVal ComplexImag As Double)
Call VB_cmcx_SetParameterA(cmcxHandle, PAddress, ComplexReal, ComplexImag)
End Sub
'得到参数PName的值
Public Sub GetParameterValueN(ByVal PName As String, ByRef ComplexReal As Double, ByRef ComplexImag As Double)
Call VB_cmcx_GetParameterValueN(cmcxHandle, PName, ComplexReal, ComplexImag)
End Sub
'按地址得到参数的值
Public Sub GetParameterValueA(ByVal PAddress As Long, ByRef ComplexReal As Double, ByRef ComplexImag As Double)
Call VB_cmcx_GetParameterValueA(PAddress, ComplexReal, ComplexImag)
End Sub
'得到参数的总数目(不包括常数)
Public Function GetUserParameterCount() As Long
GetUserParameterCount = cmcx_GetUserParameterCount(cmcxHandle)
End Function
'通过PList返回参数列表(不包括常数)
'Public Sub cmcx_GetUserParameterList(ByVal hcmcx As Long, ByRef PList As cmcx_TUserParameterList)
'测试参数PName是否已经存在
Public Function IfHaveParameter(ByVal PName As String) As Boolean
IfHaveParameter = cmcx_IfHaveParameter(cmcxHandle, PName)
End Function
'设置随机函数Rnd()的初始种子值为完全随机种子(系统用当前精确到毫秒的时间设置)
Public Sub SetRandomizeT()
Call cmcx_SetRandomizeT(cmcxHandle)
End Sub
'设置随机函数Random()的初始种子值
Public Sub SetRandomizeI(ByVal RandomSeed As Integer)
Call cmcx_SetRandomizeI(cmcxHandle, RandomSeed)
End Sub
Public Sub SetEnabledNote(ByVal Value As Boolean)
Call cmcx_SetEnabledNote(cmcxHandle, Value)
End Sub
'是否允许使用注释 (默认false)
Public Sub SetEnabledOptimizeDiv(ByVal Value As Boolean) '是否要优化常数浮点除法运算 (默认true)
Call cmcx_SetEnabledOptimizeDiv(cmcxHandle, Value)
End Sub
Public Sub SetEnabledOptimizeStack(ByVal Value As Boolean) '是否要优化堆栈 (默认true)
Call cmcx_SetEnabledOptimizeStack(cmcxHandle, Value)
End Sub
Public Sub SetEnabledOptimizeConst(ByVal Value As Boolean) '是否要优化常数运算 (默认true)
Call cmcx_SetEnabledOptimizeConst(cmcxHandle, Value)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -