`
lilisalo
  • 浏览: 1109935 次
文章分类
社区版块
存档分类
最新评论

FcScript V1.0 使用说明

 
阅读更多

欢迎访问 Forcal数学软件

FcScript V1.0 使用说明

目 录

1、FcScript用户指南
2、FcScript语言参考

3、FcScrip源代码

FcScript是由ForcalMForcal支持的脚本控件(这两个动态库必须在windows搜索路径内,或者在文件夹“c:/forcal”中),采用双接口、STA单线程套间模型。目前定义了两种接口:VBMForcal接口(用于VBScript脚本,全部使用VARIANT参数)和CMForcal接口(用于Exel、CAD等各种使用COM对象的地方)。VBMForcal用于VBScript脚本是安全的,但CMForcal需要小心地使用,否则可能导致不可预知的错误。


1、FcScript用户指南 [目录]

FcScript是由ForcalMForcal支持的脚本控件,因而需要对Forcal的语法有一定的了解。FcScript仅仅对ForcalMForcal进行了包装,因而了解Forcal,就是了解FcScript。

1.1 为什么使用FcScript

FcScript可扩展Excel、CAD等程序的功能并大幅提高其数值运算速度。使用VBScript、JScript等脚本感觉太慢时也需要使用FcScript。Forcal一级函数的计算速度约为(C/C++)或FORTRAN速度的50%左右,二级函数的速度稍有降低。

浏览由FcScript支持的网页。

想设计COM组件为Excel等程序或VBScript、JScript等脚本扩充功能时,推荐使用FcScript,因为设计一个Forcal扩展动态库更容易,而且不降低效率(调用COM组件中的函数耗时较长)。

在web设计中,FcScript既可用于服务器端也可用于客户端。如果在服务器端,可以让FcScript执行一些耗时较长的任务,可以通过Forcal扩展动态库方便地扩充脚本的功能。如果在客户端,用户需下载安装FcScript脚本后才能使用,但可以实现3D网页等其他脚本难以实现的功能。

FcScript为所有宿主程序提供高速的脚本控制和无限的可扩充性。

可以到中关村软件园或华军软件园下载ForcalMForcalOpenFc来进一步了解Forcal。

1.2 如何注册和注销FcScript

下载FcScript:下载1 下载2

如果以上站点不能正常下载,可以到 我的blog1 我的blog2 上寻找一个合适的站点下载。

软件包fcscript.rar解压缩后将文件夹更名为forcal,并放在c盘根目录下。

FcScript需要在windows中注册后才能使用。虽然FcScript可放在磁盘的任何位置,但推荐将FcScript放在文件夹“c:/forcal”中,因为FcScript会自动搜索该文件夹中的动态库进行加载。以下假定FcScript及所有相关的动态库文件在文件夹“c:/forcal”中。

注册FcScript.dll:“开始”->“运行”:regsvr32 c:/forcal/FcScript.dll

注销FcScript.dll:“开始”->“运行”:regsvr32 /u c:/forcal/FcScript.dll

如果你打算不再使用FcScript,应先注销FcScript,然后再删除文件夹“c:/forcal”。如果先删除了文件夹“c:/forcal”,用注册表清理工具清理一下注册表即可。

1.3 如何使用FcScript

一般,使用FcScript的VBComModule(或CComModule)函数可以将字符串源代码编译为一组模块(字符串源代码中可包含多个模块),然后用VBExeModule(或CExeModule)函数执行该组模块。每组模块用一个句柄标识。模块不用时,可以用VBDeleteModule(或CDeleteModule)函数销毁模块,但FcScript有垃圾自动回收的功能。

在执行一组模块之前,可以用VBSet(或CSetStr)函数向FcScript传送数据,模块执行后,可以通过VBGet(或CGetStr)函数获得运行结果。

也可以在编译完模块后,用函数VBGetForHandle(或CGetForHandle)获得模块中定义的全局函数的句柄,然后用VBCalFor(或CCalIFor、CCalRFor)执行该函数。注意:在VBMForcal中,一个函数若要用VBCalFor执行,在Forcal源代码中必须用HFor("函数名",函数类型)获取过该函数的句柄,此句柄与用函数VBGetForHandle获得的句柄相同;在CMForcal不需要这样做。

在最初使用FcScript时,仅练习使用VBComModule、VBGetForHandle、VBCalFor及VBDeleteModule(或者CComModule、CGetForHandle、CCalRFor及CDeleteModule)这几个函数即可。

1.4 访问FcScript支持的网页

网页1 网页2

1.5 在Excel中使用FcScript

在VBA中使用VBMFocal接口好像比较麻烦,下面通过Excel及VBA演示CMForcal接口。

一些自定义的VBA函数如下所示:

Option Explicit

Dim obj As Object

Sub auto_open()
Set obj = CreateObject("FcScript.CMForcal")
End Sub

Sub auto_close()
Set obj = Nothing
End Sub

Public Function ExComModule(ForStr As Range) As String '编译Forcal源程序为一个模块


Dim iCode As Long, theStr As String, nModule As Long, hModule As Long, err1 As Long, err2 As Long

nModule = 0
theStr = ForStr.Value
iCode = obj.CComModule(theStr, nModule, hModule, err1, err2)

If iCode = 0 Then
ExComModule = "编译正确!" & "模块句柄:" & hModule
Else
ExComModule = "编译错误!错误代码:" & iCode & ",出错起始位置:" & err1 & ",出错结束位置:" & err2
End If
End Function

Public Function ExExeModule(hModule As Long) As Long
'执行模块

Call obj.CExeModule(hModule, 0, 0, 0)
ExExeModule = hModule

End Function

Public Function ExDeleteModule(hModule As Long) As String
'删除一个模块

Call obj.CDeleteModule(hModule)
ExDeleteModule = "删除模块成功!"

End Function

Public Function ExLoadDll(str As String) As String
'加载动态库扩展

Call obj.CLoadDll(str)
ExLoadDll = "加载动态库扩展完毕!"

End Function

Public Function ExSetStr(str As String) As Long
'向FcScript缓冲区传送BSTR字符串

ExSetStr = obj.CSetStr(str)

End Function

Public Function ExGetStr() As String
'从FcScript缓冲区获得BSTR字符串

Dim str As String, n As Long

str = String$(128, vbNullChar)
n = obj.CGetStr(str, Len(str))

ExGetStr = str

End Function

Public Function ExReInitForcal() As String
'重新初始化Forcal

Call obj.CReInitForcal
ExReInitForcal = "重新初始化Forcal完毕!"

End Function

Public Function ExAutoSaveResult() As String
'设置FcScript自动保存模块运行结果

Call obj.CAutoSaveResult
ExAutoSaveResult = "设置FcScript自动保存模块运行结果完毕!"

End Function

Public Function ExGetResult() As String
'获得模块运行结果

Dim str As String, n As Long

str = String$(128, vbNullChar)
n = obj.CGetResult(str, Len(str))

ExGetResult = str

End Function

Public Function ExGetRForHandle(ForName As String) As Long
'获得Forcal中自定义实数函数的句柄

Dim Para As Long, NumPara As Long

ExGetRForHandle = obj.CGetForHandle(2, ForName, Para, NumPara)

End Function

Public Function ExCalIFor(hFor As Long) As LongLong
'计算Forcal中自定义整数函数的值,最多接收5个自变量,默认自变量的值全为0,修改此函数满足实际需要

Dim i(10) As LongLong

ExCalIFor = obj.CCalIFor(hFor, i(0))

End Function

Public Function ExCalRFor(hFor As Long) As Double
'计算Forcal中自定义实数函数的值,最多接收5个自变量,默认自变量的值为0~4,修改此函数满足实际需要

Dim d(10) As Double

d(0) = 0.0
d(1) = 1.0
d(2) = 2.0
d(3) = 3.0
d(4) = 4.0

ExCalRFor = obj.CCalRFor(hFor, d(0))

MsgBox "默认第一个自变量为0,第二个自变量为1,依次类推,最多接收5个自变量。" & vbCrLf & "返回时第一个自变量的值为(其它值不显示):" & d(0), 0, "ExCalRFor运行说明"

End Function

请参考文件FcScript.xls,演示应用CMForcal接口。

1.6 使用VBS文件演示FcScript

将以下VBScript文件保存为vbs文件进行演示。

(1)用函数VBCalFor执行自定义函数

Set obj=CreateObject("FcScript.VBMForcal")
dim s1, s2, s3, FcStr, nModule, hModule, err1, err2, iErrCode, hHandle, NumPara, xx

'Forcal源程序,用分号“;”分隔各个表达式,可在多行中书写表达式

'定义全局函数f和g(前面有编译符“~”),并在编译时即用HFor获得该函数的句柄(使用编译符“!”使该表达式编译后立即执行),这是使用VBCalFor所必须的
s1="~f(x,y)=x+y;"
'函数f计算两个数相加
s2="~g(x,y)= x=1.11, y=2.22, f(x,y);"
'函数g修改自变量的值,并调用了函数f
s3="!HFor("+Chr(34)+"f"+Chr(34)+",2), HFor("+Chr(34)+"g"+Chr(34)+",2);"
'用HFor获得函数f和g的句柄,注意最前面有编译符“!”,该表达式编译完后将立即执行
FcStr=s1+Chr(13)+Chr(10)+s2+Chr(13)+Chr(10)+s3
'合并Forcal源程序

MsgBox FcStr,0,"Forcal源程序"

iErrCode=obj.VBComModule (FcStr, nModule, hModule, err1, err2 )
'编译Forcal源程序为一个模块
If iErrCode=0 Then
hHandle=obj.VBGetForHandle(CLng(2),"f",NumPara)
'获得函数f的句柄
xx =Array(10.1, 20.5) '用数组xx存放自变量

MsgBox obj.VBCalFor(CLng(2), hHandle, xx),0,"f函数运算结果"
'执行函数f,并显示结果
MsgBox xx(0),0,"f函数自变量之一,没有修改"
MsgBox xx(1),0,"f函数自变量之二,没有修改"

hHandle=obj.VBGetForHandle(CLng(2),"g",NumPara) '获得函数g的句柄
xx =Array(10.1, 20.5) '用数组xx存放自变量

MsgBox obj.VBCalFor(CLng(2), hHandle, xx),0,"g函数运算结果"
'执行函数g,并显示结果
MsgBox xx(0),0,"g函数自变量之一,已被修改"
MsgBox xx(1),0,"g函数自变量之二,已被修改"
Else
MsgBox iErrCode,0,"编译错误代码"
End If
Set obj=Nothing

(2)用函数VBExeModule 执行模块

Set obj=CreateObject("FcScript.VBMForcal")
dim FcStr, nModule, hModule, err1, err2, iErrCode

FcStr="(:x)=FcGet(0,&x),FcSet(0,x+11);" 'Forcal源程序


MsgBox FcStr

iErrCode=obj.VBComModule (FcStr, nModule, hModule, err1, err2 )
'编译Forcal源程序为一个模块
If iErrCode=0 Then
err1=100.0
iErrCode=obj.VBSet(err1)
'将实数参数传送到FcScript
call obj.VBExeModule (hModule, CLng(0), CLng(0), CLng(0))
'执行一个模块
iErrCode=obj.VBGet(err1)
'从FcScript获得实数参数
MsgBox err1
Else
MsgBox iErrCode
End If
Set obj=Nothing

1.7 用网页演示FcScript

将以下网页代码保存为htm文件进行演示。需要允许网页访问控件才能演示。

<HTML>
<HEAD><TITLE>一个FcScript简单例子</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
    Sub Button1_OnClick

Set obj=CreateObject("FcScript.VBMForcal")
dim FcStr, nModule, hModule, err1, err2, iErrCode

FcStr="FcSet{0,"+document.Form1.ForStr.value+"};" 'Forcal源程序


MsgBox FcStr

iErrCode=obj.VBComModule (FcStr, nModule, hModule, err1, err2 )
'编译Forcal源程序为一个模块
If iErrCode=0 Then
call obj.VBExeModule (hModule, CLng(0), CLng(0), CLng(0))
'执行一个模块
err1=1.0
'使err1为实数类型
iErrCode=obj.VBGet(err1)
'从FcScript获得实数参数
MsgBox err1
Else
MsgBox iErrCode
End If
Set obj=Nothing

    End Sub
-->
</SCRIPT>
</HEAD>
<BODY>
    <H3>一个FcScript简单例子</H3><HR>
    <FORM name="Form1" method="post" action="">
        <input type="text" name="ForStr" value="2-cos(2.3)*sqrt[9]" /> <br> <br>
        <INPUT NAME="Button1" TYPE="BUTTON" VALUE="单击此处演示FcScript">
    </FORM>
</BODY>
</HTML>

1.8 传送多个数据的VBS例子

将以下VBScript文件保存为vbs文件进行演示。

Set obj=CreateObject("FcScript.VBMForcal")
dim s1, s2, s3, FcStr, nModule, hModule, err1, err2, iErrCode, xx

s1="f(x)= x+11;" 'Forcal源程序,函数定义

s2="g(x)= x-11;"
'Forcal源程序,函数定义
s3="(:x1,x2,x3)= FcGet(0,&x1,&x2,&x3),FcSet[0,f(x1),f(x2),g(x3)];"
'Forcal源程序
FcStr=s1+s2+s3
'合并Forcal源程序

MsgBox FcStr

iErrCode=obj.VBComModule (FcStr, nModule, hModule, err1, err2 )
'编译Forcal源程序为一个模块
If iErrCode=0 Then
xx =Array(100.0, 200.0, 300.0)
iErrCode=obj.VBSet(xx)
'将实数参数传送到FcScript
call obj.VBExeModule (hModule, CLng(0), CLng(0), CLng(0))
'执行一个模块
iErrCode=obj.VBGet(xx)
'从FcScript获得实数参数
MsgBox xx(0)
MsgBox xx(1)
MsgBox xx(2)
Else
MsgBox iErrCode
End If
Set obj=Nothing

1.9 传送字符串的VBS例子

将以下VBScript文件保存为vbs文件进行演示。

Set obj=CreateObject("FcScript.VBMForcal")
dim s1, s2, FcStr, nModule, hModule, err1, err2, iErrCode, str

obj.VBLoadDll(Chr(34)+"FcData32W"+Chr(34)) '使用FcData32W.dll

s1="i:f(str:i,k)= i=0, while{k=str.i.get(), str.i.set(k+1), i++};"
'Forcal源程序,函数定义
s2="i:(:str)= str=new[string,FcGetStr(0)], FcGetStr(str), f(str), FcSetStr[str], delete(str);"
'Forcal源程序
FcStr=s1+s2
'合并Forcal源程序

MsgBox FcStr

iErrCode=obj.VBComModule (FcStr, nModule, hModule, err1, err2 )
'编译Forcal源程序为一个模块
If iErrCode=0 Then
str ="as d"
iErrCode=obj.VBSet(str)
'将字符串参数传送到FcScript
call obj.VBExeModule (hModule, CLng(0), CLng(0), CLng(0))
'执行一个模块
iErrCode=obj.VBGet(str)
'从FcScript获得字符串参数
MsgBox str
Else
MsgBox iErrCode
End If
Set obj=Nothing

1.10 获得模块运行结果的VBS例子

将以下VBScript文件保存为vbs文件进行演示。

Set obj=CreateObject("FcScript.VBMForcal")
dim s1, s2, s3, FcStr, nModule, hModule, err1, err2, iErrCode

s1="i: 2+3*6-20%3;" 'Forcal源程序, 整数表达式

s2="
c: 2.3-sin(2.2+3.3i);" 'Forcal源程序,复数表达式
s3="2-cos[sin(2)-3];"
'Forcal源程序,实数表达式
FcStr=s1+s2+s3
'合并Forcal源程序

MsgBox FcStr

iErrCode=obj.VBComModule (FcStr, nModule, hModule, err1, err2 )
'编译Forcal源程序为一个模块
If iErrCode=0 Then
obj.VBAutoSaveResult()
'通知FcScript自动保存运行结果
call obj.VBExeModule (hModule, CLng(0), CLng(0), CLng(0))
'执行一个模块
MsgBox obj.VBGetResult()
'显示运行结果
Else
MsgBox iErrCode
End If
Set obj=Nothing


2 FcScript语言参考 [目录]

2.1 VBMForcal接口中实现的函数

所有接口参数都是VARIANT类型。

2.1.1 申请进入或退出Forcal工作区:VBUseForcal(iUse)

未启用该方法。可以参考MForcal中的函数UseForcal的说明。iUse必须是长整数

2.1.2 编译源程序:VBComModule(FcStr,nModule,hModule,err1,err2)

将源程序中的表达式编译为一个或多个模块。源程序中可以用#MODULE#和#END#定义一个子模块。即#MODULE#和#END#之间的表达式定义为一个子模块。在模块中,以~开头的表达式被编译为公有表达式,能被其他模块访问到,其余的表达式均被编译为私有表达式,其他模块无法访问。
FcStr:指向源程序的字符串。
nModule:返回多个模块的最小模块号。一般用不到该参数。返回值是长整数
hModule:返回模块的句柄,用于执行该模块。返回值是长整数
err1和err2:返回编译出错位置。返回值是长整数
该函数返回编译代码,若为0表示编译通过。返回值是长整数

详细请参考MForcal中的函数ComModule的说明。

2.1.3 执行模块:VBExeModule(hModule,outl,outd,outc)

hModule:编译源程序时得到的模块的句柄。必须是长整数
outl、outd、outc:未启用这三个参数,一般这三个参数设为0,必须是长整数

详细请参考MForcal中的函数ExeModule的说明。

2.1.4 删除模块:VBDeleteModule(hModule)

hModule:编译源程序时得到的模块的句柄。必须是长整数

详细请参考MForcal中的函数ExeModule的说明。

2.1.5 加载Forcal动态库扩展:VBLoadDll(str)

FcStr:含有Forcal扩展动态库名称的字符串。

FcScript允许加载多个Forcal扩展动态库。Forcal扩展动态库名字要放在双引号"..."之间。忽略在尖括号<"..." ...>内的Forcal扩展动态库。

例如:"FcData32","d://forcal//ofc32"

需要注意Forcal扩展动态库的加载顺序。

该函数会自动加载文件夹“c:/forcal”中的动态库。

2.1.6 向FcScript缓冲区传送数据:VBSet(Val)

在FcScript中有一个缓冲区,VBScript和缓冲区可以相互传送数据。在VBScript中使用该函数可以将Val数据传送到该缓冲区,函数返回传送数据的实际数目(如果Val是数组,将返回数组元素的个数)。

该函数可以将64位长整数、双精度实数、一维64位长整数数组、一维双精度实数数组或字符串传送到缓冲区,取决于Val的类型。

如果Val是64位长整数,将传送到64位长整数缓冲区;如果Val是双精度实数,将传送到双精度实数缓冲区,以此类推。

该函数总是从缓冲区的起始处存放数据,也就是说,每次调用该函数,以前存放的数据都会丢失。

2.1.7 从FcScript缓冲区获得数据:VBGet(Val)

在FcScript中有一个缓冲区,VBScript和缓冲区可以相互传送数据。在VBScript中使用该函数可以将缓冲区中的数据传送到Val中,函数返回获得数据的实际数目(如果Val是数组,将返回数组元素的个数)。

该函数可以将缓冲区中的64位长整数、双精度实数、一维64位长整数数组、一维双精度实数数组或字符串传送到Val,取决于Val的类型。

如果Val是64位长整数,将获得缓冲区中的64位长整数数据;如果Val是双精度实数,将获得缓冲区中的双精度实数数据,以此类推。

该函数总是从缓冲区的起始处获得数据。

2.1.8 重新初始化Forcal:VBReInitForcal()

使Forcal恢复至刚刚加载时的状态。

2.1.9 设置接收Forcal信息的函数:VBFcMessage(FcMessage)

Forcal在运行时,有些函数会产生一些信息输出,设置该函数可以接收这些信息。 未启用该方法。

详细请参考MForcal中的函数FcMessage的说明。

2.1.10 设置FcScript自动保存模块运行结果:VBAutoSaveResult()

需要在VBExeModule之前使用该函数,且要求VBExeModule的后三个参数全为0。该函数将清空保存运行结果的缓冲区。

如果模块运行期间输出较多信息,可以在Forcal代码中用函数SetResultBufMax设置缓冲区的大小。

2.1.11 获得模块运行结果:VBGetResult()

如果在VBExeModule之前执行了函数VBAutoSaveResult,可以在VBExeModule之后用该函数获得模块的运行结果,函数返回一个字符串。

2.1.12 获得Forcal中自定义函数的句柄:VBGetForHandle(ForType,ForName,NumPara)

ForType:表达式的类型。只能取1(标识整数表达式)、2(标识实数表达式)、3(标识复数表达式);如果名称包含模块命名空间访问符::(如:"A::Fun"),只能取-1(标识整数表达式)、-2(标识实数表达式)、-3(标识复数表达式)。必须是长整数
ForName
:自定义函数名,字符串形式。可以包含模块命名空间访问符::(如:"A::Fun")。
NumPara
:返回函数的参数个数。当NumPara=-1时表示有0个自变量,当NumPara=0时表示有1个自变量,当NumPara=1时表示有2个自变量,依次类推。返回值是长整数
该函数返回自定义函数的句柄,若为0表示函数不存在。返回值是长整数

2.1.13 执行Forcal中的自定义函数并返回运算结果:VBCalFor(ForType,ForHandle,Para)

ForType:表达式的类型。只能取1(标识整数表达式)、2(标识实数表达式)、3(标识复数表达式,不过尚未启用)。必须是长整数
ForHandle:由VBGetForHandle
获得的自定义函数的句柄。必须是长整数
Para:一维数组,存放自定义函数的参数。当ForType=1时数组为64位长整数类型,当ForType=2时数组为实数类型,当ForType
=3时数组为复数类型。
该函数返回运算结果。运算结果的类型与数组Para的类型相同

注意:一个函数若要用VBCalFor执行,在Forcal源代码中必须用HFor("函数名",函数类型)获取过该函数的句柄,此句柄与用函数VBGetForHandle获得的句柄相同。

2.2 CMForcal接口中实现的函数

2.2.1 申请进入或退出Forcal工作区:CUseForcal(iUse)

iUse及返回值是长整数

参考MForcal中函数UseForcal的说明。

2.2.2 编译源程序:CComModule(FcStr,nModule,hModule,err1,err2)

将源程序中的表达式编译为一个或多个模块。源程序中可以用#MODULE#和#END#定义一个子模块。即#MODULE#和#END#之间的表达式定义为一个子模块。在模块中,以~开头的表达式被编译为公有表达式,能被其他模块访问到,其余的表达式均被编译为私有表达式,其他模块无法访问。
FcStr:指向源程序的BSTR字符串。
nModule:返回多个模块的最小模块号。一般用不到该参数。返回值是长整数
hModule:返回模块的句柄,用于执行该模块。返回值是长整数
err1和err2:返回编译出错位置。返回值是长整数
该函数返回编译代码,若为0表示编译通过。返回值是长整数

详细请参考MForcal中的函数ComModule的说明。

2.2.3 执行模块:CExeModule(hModule,outl,outd,outc)

hModule:编译源程序时得到的模块的句柄。必须是长整数
outl、outd、outc:一般这三个参数可设为0,必须是长整数

详细请参考MForcal中的函数ExeModule的说明。

2.2.4 删除模块:CDeleteModule(hModule)

hModule:编译源程序时得到的模块的句柄。必须是长整数

详细请参考MForcal中的函数ExeModule的说明。

2.2.5 加载Forcal动态库扩展:CLoadDll(str)

FcStr:含有Forcal扩展动态库名称的BSTR字符串。

FcScript允许加载多个Forcal扩展动态库。Forcal扩展动态库名字要放在双引号"..."之间。忽略在尖括号<"..." ...>内的Forcal扩展动态库。

例如:"FcData32","d://forcal//ofc32"

需要注意Forcal扩展动态库的加载顺序。

该函数会自动加载文件夹“c:/forcal”中的动态库。

2.2.6 向FcScript缓冲区传送BSTR字符串:CSetStr(str)

在FcScript中有一个缓冲区,主程序和缓冲区可以相互传送数据。在主程序中使用该函数可以将BSTR字符串传送到该缓冲区,函数返回传送的实际字符数。

该函数总是从缓冲区的起始处存放数据,也就是说,每次调用该函数,以前存放的数据都会丢失。

2.2.7 从FcScript缓冲区获得BSTR字符串:CGetStr(str,nstr)

str:接收数据的BSTR*型缓冲区指针。
nstr:缓冲区str的大小,长整数

在FcScript中有一个缓冲区,主程序和缓冲区可以相互传送数据。在主程序中使用该函数可以将缓冲区中的BSTR字符串传送到str中,函数返回传送的实际字符数。若nstr太小,传送失败。

该函数总是从缓冲区的起始处获得数据。

2.2.8 重新初始化Forcal:CReInitForcal()

使Forcal恢复至刚刚加载时的状态。

2.2.9 设置接收Forcal信息的函数:CFcMessage(FcMessage)

Forcal在运行时,有些函数会产生一些信息输出,设置该函数可以接收这些信息。

详细请参考MForcal中的函数FcMessage的说明。

2.2.10 设置FcScript自动保存模块运行结果:CAutoSaveResult()

需要在CExeModule之前使用该函数,且要求CExeModule的后三个参数全为0。该函数将清空保存运行结果的缓冲区。

如果模块运行期间输出较多信息,可以在Forcal代码中用函数SetResultBufMax设置缓冲区的大小。

2.2.11 获得模块运行结果:CGetResult(str,nstr)

str:接收数据的BSTR*型缓冲区指针。
nstr:缓冲区str的大小,长整数

如果在CExeModule之前执行了函数CAutoSaveResult,可以在CExeModule之后用该函数获得模块的运行结果,函数返回实际接收的字符数。若nstr太小,传送失败。

2.2.12 获得Forcal中自定义函数的句柄:CGetForHandle(ForType,ForName,Para,NumPara)

ForType:表达式的类型。只能取1(标识整数表达式)、2(标识实数表达式)、3(标识复数表达式);如果名称包含模块命名空间访问符::(如:"A::Fun"),只能取-1(标识整数表达式)、-2(标识实数表达式)、-3(标识复数表达式)。必须是长整数
ForName
:自定义函数名,BSTR字符串形式。可以包含模块命名空间访问符::(如:"A::Fun")。
Para:返回指向函数自变量的指针,可通过该指针输入自变量参数。指针的类型取决于ForType,ForType=1时是长整数指针,ForType=2时是双精度实数指针,ForType
=3时是复数指针。返回值是长整数
NumPara
:返回函数的参数个数。当NumPara=-1时表示有0个自变量,当NumPara=0时表示有1个自变量,当NumPara=1时表示有2个自变量,依次类推。返回值是长整数
该函数返回自定义函数的句柄,若为0表示函数不存在。返回值是长整数

2.2.13 执行Forcal中的自定义整数函数并返回运算结果:CCalIFor(ForHandle,Para)

ForHandle:由CGetForHandle获得的自定义函数的句柄。必须是长整数
Para
:一维64位长整数数组,存放自定义函数的参数。
该函数返回64位长整数型运算结果。

2.2.14 执行Forcal中的自定义实数函数并返回运算结果:CCalRFor(ForHandle,Para)

ForHandle:由CGetForHandle获得的自定义函数的句柄。必须是长整数
Para
:一维双精度实数数组,存放自定义函数的参数。
该函数返回双精度实数型运算结果。

2.3 FcScript中的Forcal二级函数

2.3.1 向FcScript缓冲区传送数据[整数函数,实数函数]:FcSet(&i,x1,x2,... ...,xn)

在FcScript中有一个缓冲区,缓冲区和Forcal可以相互传送数据。缓冲区是一个一维数组,起始地址为0。在Forcal中使用FcSet函数可以将数据x1,x2,... ...传送到该缓冲区自地址i开始的连续区域,函数返回下一个元素的地址(即元素xn后的地址,如果使用引用参数,i也指向该地址)。如果缓冲区没有足够的空间存放数据,该函数将自动扩充缓冲区的大小。

在整数表达式中,将把数据传送到整数缓冲区;在实数表达式中,将把数据传送到实数缓冲区。

该函数可能返回运行错误,错误代码1:非法的元素地址;2:无法分配内存。

FcSet函数的特殊用法:

FcSet(); //函数返回当前缓冲区大小
FcSet(n);
//创建至少能存放n个数据元素的缓冲区

一般,先用FcSet(n)创建能满足要求的缓冲区,然后存放数据,可提高运行效率。

2.3.2 从FcScript缓冲区获得数据[整数函数,实数函数]:FcGet(&i,&x1,&x2,... ...,&xn)

在FcScript中有一个缓冲区,缓冲区和Forcal可以相互传送数据。缓冲区是一个一维数组,起始地址为0。在Forcal中使用FcGet函数可以将缓冲区中从地址i开始的数据传送到x1,x2,... ...,xn,必须使用引用参数,函数返回下一个元素的地址(即元素xn后的地址,如果使用引用参数,i也指向该地址)。

在整数表达式中,将获得整数缓冲区中的数据;在实数表达式中,将获得实数缓冲区中的数据。

该函数可能返回运行错误,错误代码1:非法的元素地址。

FcGet函数的特殊用法:FcGet(); //函数返回当前缓冲区大小

2.3.3 向FcScript缓冲区传送UNICODE字符串[整数函数]:FcSetStr(Wstr)

在FcScript中有一个UNICODE字符串缓冲区,该缓冲区可以和FcData一维wchar_s数组相互传送数据。在Forcal中使用FcSetStr函数可以将一维iwchar_s数组Wstr传送到该缓冲区,函数总是返回0。如果缓冲区没有足够的空间存放数据,该函数将自动扩充缓冲区的大小。该函数需要FcData32W.dll的支持。

在一维wchar_s数组中遇到0(UNICODE字符串结束标记)时将结束传送,如果没有0,将返回一个运行错误。

该函数可能返回运行错误,错误代码1:数组不存在;2:不是一维宽字符数组;3:内存错误;4:字符串没有结束标志0。

FcSetStr函数的特殊用法:FcSetStr(0); //函数返回当前缓冲区大小

2.3.4 从FcScript缓冲区获得UNICODE字符串[整数函数]:FcGetStr(Wstr)

在FcScript中有一个UNICODE字符串缓冲区,该缓冲区可以和FcData一维wchar_s数组相互传送数据。在Forcal中使用FcGetStr函数可以将缓冲区中的字符串传送到一维wchar_s数组Wstr,函数总是返回0。该函数需要FcData32W.dll的支持。

该函数可能返回运行错误,错误代码1:数组不存在;2:不是一维宽字符数组;3:一维宽字符数组太小。

FcGetStr函数的特殊用法:FcGetStr(0); //函数返回当前缓冲区大小

2.3.5 设置FcScript运行结果缓冲区大小[整数函数,实数函数]:SetResultBufMax(n)

该函数设置FcScript运行结果缓冲区的大小。函数总是返回实际的缓冲区大小。为了提高运行效率,一般在程序开头使用该函数。


3 FcScript源代码 [目录]

由于作者对com、atl、web不熟悉,维护FcScript较困难,如果你是这方面的高手,可以下载FcScript的源代码加以维护。

下载1 下载2

如果以上站点不能正常下载,可以到 我的blog1 我的blog2 上寻找一个合适的站点下载。


版权所有© Forcal数学软件 2002-2009,保留所有权利
E-mail:
forcal@sina.com QQ:630715621

最近更新:
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%Y年%m月%d日" startspan -->2009年11月18日<!--webbot bot="Timestamp" i-checksum="1644" endspan -->

分享到:
评论

相关推荐

    钢筋混凝土污水池及提升泵站施工方案.doc

    课程设计污水处理

    PHP基于Web的subversion用户管理系统(源代码+设计说明书).zip

    PHP基于Web的subversion用户管理系统(源代码+设计说明书).zip

    node-v12.22.10-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    The Experiment 3 of Engineering Electromagnetics.pdf

    The Experiment 3 of Engineering Electromagnetics.pdf

    node-v12.11.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    JSP网络购物中心毕业设计(源代码+设计说明书).zip

    JSP网络购物中心毕业设计(源代码+设计说明书).zip

    卷积神经网络-基于VGGNet实现的遥感图像分类算法.zip

    卷积神经网络 卷积神经网络_基于VGGNet实现的遥感图像分类算法

    node-v0.12.10.tar.xz

    node-v0.12.10.tar

    转型计划gl.ppt

    转型计划gl.ppt

    node-v10.24.1-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    led.zip

    led.zip

    ASP+ACCESS实验室设备管理系统(源代码+设计说明书).zip

    ASP+ACCESS实验室设备管理系统(源代码+设计说明书).zip

    jsp网上超市设计与实现(源代码+设计说明书).zip

    jsp网上超市设计与实现(源代码+设计说明书).zip

    node-v11.12.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    商业分析工具:常用战略分析工具gl.ppt

    商业分析工具:常用战略分析工具gl.ppt

    行业分析模板--初学者必备gl.ppt

    行业分析模板--初学者必备gl.ppt

    dephi+sqlserver2000题库与试卷生成系统.zip

    dephi+sqlserver2000题库与试卷生成系统.zip

    基于matlab实现阵列信号处理MVDR程序,高分辨方位估计从事人员可供参考 .rar

    基于matlab实现阵列信号处理MVDR程序,高分辨方位估计从事人员可供参考。.rar

    一种全新的基于python 用于疲劳强度迟滞回线的脚本分析.rar

    一种全新的基于python 用于疲劳强度迟滞回线的脚本分析.rar

    基于matlab实现的对数据进行傅立叶分析,从时域转换到频域,观察信号的频谱结构,从分析信号的特点.rar

    基于matlab实现的对数据进行傅立叶分析,从时域转换到频域,观察信号的频谱结构,从分析信号的特点.rar

Global site tag (gtag.js) - Google Analytics