C/C++操作Lu脚本变量
来源:互联网 发布:单片机电压测量电路 编辑:程序博客网 时间:2024/05/22 10:58
欢迎访问Lu程序设计
C/C++操作Lu脚本变量
1 说明
要演示本文的例子,你必须下载Lu32脚本系统。本文的例子需要lu32.dll、lu32.lib、C格式的头文件lu32.h,相信你会找到并正确使用这几个文件。
用C/C++编译器创建一个控制台应用程序,复制本文的例子代码直接编译运行即可。
2 Lu脚本变量
Lu脚本函数(表达式)中可以定义和使用五种变量:自变量、动态变量、静态变量、模块变量和全局变量。自变量、动态变量和静态变量只能被定义该变量的表达式所访问;模块变量可被同一模块的所有表达式所访问,其他模块的表达式无法访问;全局变量可被所有的表达式所访问。自变量用于向表达式传递参数,因此自变量也称为形式参数。动态变量只在表达式执行时起作用,一旦表达式执行完毕,动态变量也随之失效。静态变量存在于表达式的整个生命周期,每次表达式执行完毕,静态变量的值被保留。Lu在编译表达式时,自变量不进行初始化;动态变量初始化为nil;静态变量初始化为0;模块变量和全局变量在第一次生成时初始化为nil,以后使用不再进行初始化。
在Lu表达式(函数)中,通常情况下,变量要先定义后使用,变量在表达式的开头进行定义,格式如下:
F(a,b : x,y,static,u : s,t,common,v)=
{
x=1,y=2,
a+b+x+y+static+u+s+t+common+v
}
F是表达式的名字,a和b是自变量,x和y是动态变量,static和u是静态变量,s和t是模块变量,common和v是全局变量。自变量、动态变量和静态变量以及模块变量和全局变量之间用冒号分隔,即第一个冒号前为自变量,两个冒号之间为动态变量和静态变量,第二个冒号后为模块变量和全局变量。两个冒号之间用关键字static分隔动态变量和静态变量,static之前为动态变量,static及以后变量均为静态变量,关键字static只能用在两个冒号之间。第二个冒号后用关键字common分隔模块变量和全局变量,common之前为模块变量,common及以后变量均为全局变量,关键字common只能用在第二个冒号后。Lu中的所有变量均可缺省。
C/C++可操作的有意义的Lu脚本变量是模块变量和全局变量,可通过脚本函数操作模块变量和全局变量。
3 代码
(1)最简单的C/C++存取Lu模块变量的例子
#include <stdio.h>#include "lu32.h"#pragma comment( lib, "lu32.lib" )void main(void){void *hM1_1,*hM1_2;//存放表达式句柄,即脚本函数句柄luINT nPara;//存放表达式的自变量个数LuData *paraM1_1,*paraM1_2;//存放输入自变量的数组指针LuData Val;//存放表达式的值luINT ErrBegin,ErrEnd;//表达式编译出错的初始位置和结束位置wchar_t M1_1[]=L"set_module_var(x :: mm) = mm=x";//设置模块1的模块变量wchar_t M1_2[]=L"get_module_var( :: mm) = mm";//获得模块1的模块变量if(!InitLu()) return;//初始化Lu//因表达式都正确,故以下对编译结果都没有进行检查LuCom(M1_1,1,0,0,&hM1_1,&nPara,¶M1_1,&ErrBegin,&ErrEnd);//编译表达式M1_1为模块1的全局函数LuCom(M1_2,1,0,0,&hM1_2,&nPara,¶M1_2,&ErrBegin,&ErrEnd);//编译表达式M1_2为模块1的全局函数paraM1_1[0].BType=luStaData_int64; paraM1_1[0].VType=luStaData_int64; paraM1_1[0].x=100;LuCal(hM1_1,paraM1_1);//设置模块1的模块变量Val=LuCal(hM1_2,paraM1_2);//获得模块1的模块变量printf("模块1的模块变量= %I64d \n",Val.x);FreeLu();//释放Lu}
运行结果:
模块1的模块变量= 100
(2)C/C++存取Lu模块变量及全局变量的例子
#include <stdio.h>#include "lu32.h"#pragma comment( lib, "lu32.lib" )void main(void){void *hM1_1,*hM1_2,*hM1_3,*hM2_1,*hM2_2,*hM2_3,*hM3_1,*hM3_2;//存放表达式句柄,即脚本函数句柄luINT nPara;//存放表达式的自变量个数LuData *paraM1_1,*paraM1_2,*paraM1_3,*paraM2_1,*paraM2_2,*paraM2_3,*paraM3_1,*paraM3_2;//存放输入自变量的数组指针LuData Val;//存放表达式的值luINT ErrBegin,ErrEnd;//表达式编译出错的初始位置和结束位置wchar_t M1_1[]=L"set_module_var1(x :: mm) = mm=x";//设置模块1的模块变量wchar_t M1_2[]=L"get_module_var1( :: mm) = mm";//获得模块1的模块变量wchar_t M1_3[]=L"inc_var1( :: mm, common, nn) = mm++, nn++";//模块1的模块变量及全局变量均增1wchar_t M2_1[]=L"set_module_var2(x :: mm) = mm=x";//设置模块2的模块变量wchar_t M2_2[]=L"get_module_var2( :: mm) = mm";//获得模块2的模块变量wchar_t M2_3[]=L"inc_var2( :: mm, common, nn) = mm++, nn++";//模块2的模块变量及全局变量均增1wchar_t M3_1[]=L"set_common_var1(x :: common, nn) = nn=x";//模块3设置全局变量wchar_t M3_2[]=L"get_common_var1( :: common, nn) = nn";//模块3获得全局变量if(!InitLu()) return;//初始化Lu//因表达式都正确,故以下对编译结果都没有进行检查LuCom(M1_1,1,0,0,&hM1_1,&nPara,¶M1_1,&ErrBegin,&ErrEnd);//编译表达式M1_1为模块1的全局函数LuCom(M1_2,1,0,0,&hM1_2,&nPara,¶M1_2,&ErrBegin,&ErrEnd);//编译表达式M1_2为模块1的全局函数LuCom(M1_3,1,0,0,&hM1_3,&nPara,¶M1_3,&ErrBegin,&ErrEnd);//编译表达式M1_3为模块1的全局函数LuCom(M2_1,2,0,0,&hM2_1,&nPara,¶M2_1,&ErrBegin,&ErrEnd);//编译表达式M2_1为模块2的全局函数LuCom(M2_2,2,0,0,&hM2_2,&nPara,¶M2_2,&ErrBegin,&ErrEnd);//编译表达式M2_2为模块2的全局函数LuCom(M2_3,2,0,0,&hM2_3,&nPara,¶M2_3,&ErrBegin,&ErrEnd);//编译表达式M2_3为模块2的全局函数LuCom(M3_1,3,0,0,&hM3_1,&nPara,¶M3_1,&ErrBegin,&ErrEnd);//编译表达式M3_1为模块3的全局函数LuCom(M3_2,3,0,0,&hM3_2,&nPara,¶M3_2,&ErrBegin,&ErrEnd);//编译表达式M3_2为模块3的全局函数paraM1_1[0].BType=luStaData_int64; paraM1_1[0].VType=luStaData_int64; paraM1_1[0].x=1;LuCal(hM1_1,paraM1_1);//设置模块1的模块变量paraM2_1[0].BType=luStaData_int64; paraM2_1[0].VType=luStaData_int64; paraM2_1[0].x=2;LuCal(hM2_1,paraM2_1);//设置模块2的模块变量paraM3_1[0].BType=luStaData_int64; paraM3_1[0].VType=luStaData_int64; paraM3_1[0].x=3;LuCal(hM3_1,paraM3_1);//设置模块3的全局变量LuCal(hM1_3,paraM1_3);//模块1的模块变量及全局变量均增1LuCal(hM2_3,paraM2_3);//模块2的模块变量及全局变量均增1Val=LuCal(hM1_2,paraM1_2);//获得模块1的模块变量printf("模块1的模块变量= %I64d \n",Val.x);Val=LuCal(hM2_2,paraM2_2);//获得模块2的模块变量printf("模块2的模块变量= %I64d \n",Val.x);Val=LuCal(hM3_2,paraM3_2);//获得模块3的全局变量printf("模块3的全局变量= %I64d \n",Val.x);FreeLu();//释放Lu}
运行结果:
模块1的模块变量= 2
模块2的模块变量= 3
模块3的全局变量= 5
(3)C/C++存取Lu模块变量及全局变量的效率测试
#include <stdio.h>#include <time.h>#include "lu32.h"#pragma comment( lib, "lu32.lib" )__int64 a1,aa2,aaa3,aabb,aabbcc,d1,dd2,ddd3,ddee,ddeeff;void main(void){void *hM1_1,*hM1_2,*hM1_3;//存放表达式句柄,即脚本函数句柄luINT nPara;//存放表达式的自变量个数LuData *paraM1_1,*paraM1_2,*paraM1_3;//存放输入自变量的数组指针LuData Val;//存放表达式的值luINT ErrBegin,ErrEnd;//表达式编译出错的初始位置和结束位置wchar_t M1_1[]=L"set(x :: a1,aa2,aaa3,aabb,aabbcc, common,d1,dd2,ddd3,ddee,ddeeff) = a1=x,aa2=x,aaa3=x,aabb=x,aabbcc=x,d1=x,dd2=x,ddd3=x,ddee=x,ddeeff=x";wchar_t M1_2[]=L"inc( :: a1,aa2,aaa3,aabb,aabbcc, common,d1,dd2,ddd3,ddee,ddeeff) = a1++,aa2++,aaa3++,aabb++,aabbcc++,d1++,dd2++,ddd3++,ddee++,ddeeff++";wchar_t M1_3[]=L"get( :: a1,aa2,aaa3,aabb,aabbcc, common,d1,dd2,ddd3,ddee,ddeeff) = a1+aa2+aaa3+aabb+aabbcc+d1+dd2+ddd3+ddee+ddeeff";__int64 i;clock_t start, end;__int64 sum,x;if(!InitLu()) return;//初始化Lu//因表达式都正确,故以下对编译结果都没有进行检查LuCom(M1_1,1,0,0,&hM1_1,&nPara,¶M1_1,&ErrBegin,&ErrEnd);//编译表达式M1_1为模块1的全局函数LuCom(M1_2,1,0,0,&hM1_2,&nPara,¶M1_2,&ErrBegin,&ErrEnd);//编译表达式M1_2为模块1的全局函数LuCom(M1_3,1,0,0,&hM1_3,&nPara,¶M1_3,&ErrBegin,&ErrEnd);//编译表达式M1_3为模块1的全局函数start = clock();paraM1_1[0].BType=luStaData_int64; paraM1_1[0].VType=luStaData_int64; paraM1_1[0].x=0;LuCal(hM1_1,paraM1_1);//设置模块1的模块变量及全局变量for(i=0;i<1000000;i++) LuCal(hM1_2,paraM1_2);//循环执行脚本函数inc若干次Val=LuCal(hM1_3,paraM1_3);//获得模块1的模块变量及全局变量相加的结果end = clock();printf("C call Lu runing time is %d ms, sum= %I64d \n",(int)(end - start), Val.x);start = clock();x=0;a1=x; aa2=x; aaa3=x; aabb=x; aabbcc=x; d1=x; dd2=x; ddd3=x; ddee=x; ddeeff=x;for(i=0;i<1000000;i++)//循环执行若干次{a1++; aa2++; aaa3++; aabb++; aabbcc++; d1++; dd2++; ddd3++; ddee++; ddeeff++;}sum=a1+aa2+aaa3+aabb+aabbcc+d1+dd2+ddd3+ddee+ddeeff;//获得全局变量相加的结果end = clock();printf("C runing time is %d ms, sum= %I64d \n",(int)(end - start), sum);FreeLu();//释放Lu}
运行结果:
C call Lu runing time is 562 ms, sum= 10000000
C runing time is 31 ms, sum= 10000000
4函数说明
本例用到了Lu的四个输出函数:初始化Lu的函数InitLu,释放Lu的函数FreeLu,编译表达式的函数LuCom和计算表达式的函数LuCal。从这里查看这些函数的说明:Lu编程指南。
5 难点分析
代码1比较简单,分析从略。
代码2演示了C/C++程序如何存取Lu脚本的模块变量及全局变量。可以看出,Lu脚本的不同模块中存在同名模块变量时不会相互干扰,但全局变量是唯一的。
代码3结果表明:C/C++调用Lu脚本函数(存取Lu脚本变量)的效率大致为C/C++效率的1/20~1/50。如果你对脚本效率感兴趣,请参考:Lu与C/C++、Forcal、MATLAB、Python、Lua等各种语言的速度比较。
6 其他
你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。
版权所有© Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com QQ:630715621
最近更新: 2013年12月23日
- C/C++操作Lu脚本变量
- C/C++使用Lu脚本中的动态对象lu
- 在C/C++中使用Lu脚本
- C/C++调用Lu脚本函数
- C/C++模块化编译Lu脚本函数
- C/C++使用Lu脚本字符串
- C/C++使用Lu脚本数组
- C/C++使用Lu脚本协程
- 使用C/C++设计Lu脚本函数时调用Lu脚本函数
- C/C++使用Lu脚本字符串键树
- C/C++使用MLu简化Lu脚本系统的使用
- 使用C/C++设计多线程程序监控Lu脚本运行
- [C语言]矩阵的LU分解
- C/C++调用Lu的入门程序
- C/C++使用Lu扩展动态库
- c 语言中 %d,%lu等区别
- LU分解不分块的C程序
- Lu分解法的C语言实现
- 回收站内被清空的数据还可以找回来
- 积累
- JNI调用C方法
- JBoss 系列七十一:jBPM 6 发布,快速安装,新功能介绍
- XPCOM的JS回调(VS2010)
- C/C++操作Lu脚本变量
- jQuery easyui刷新当前tabs
- 花语
- cache和TLB的同于不同
- Gitolite 构建 Git 服务器
- uploadify 上传按钮 显示中文
- draw9patch超详细教程
- 图片轮播JS效果
- personal学习网址大全