欢迎访问 Lu程序设计
C/C++使用Lu脚本数组
1 说明
要演示本文的例子,你必须下载Lu32脚本系统。本文的例子需要lu32.dll、lu32.lib、C格式的头文件lu32.h,相信你会找到并正确使用这几个文件。
用C/C++编译器创建一个控制台应用程序,复制本文的例子代码直接编译运行即可。
2 关于Lu数组
Lu数组有静态和动态两种,详细参考Lu用户指南。
Lu动态数组是多维的,通常用函数new生成。静态数组是一维的,通过一组函数操作静态字符串来实现。使用数组之前,须先用转义字符"\[n]"定义足够的静态空间。
例子1:静态Unicode字符数组
(:i,k,str)=
{
str="**\[26]**", //定义字符串str,共30个字符(\[26]定义了26个字符),这就是一个Unicode字符数组
k=["a"], k=k[0], //用获得字符"a"的Unicode值并赋值给k
i=0, while{i<26, str[2+i]=k++, i++}, //将星号之间是字符空间设置为26个英文字母
o(str) //输出字符数组str
};
结果:
**abcdefghijklmnopqrstuvwxyz**
例子2:静态实数数组,字符串必须定义成"\&... ..."格式。
(:i,k,a,s)=
{
a=realss("\&\[10]"), //定义4×10个字符长的字符串(参考Lu用户指南),并用函数realss转换为实数数组
k=len(a), //获得数组长度
i=0, while{i<k, a(i)=1.0, i++}, //将数组的每一个元素都设为1.0
i=0, s=0.0, while{i<k, s=s+a(i++)}, //将数组的所有元素都加起来
s //返回相加后的值
};
结果:
10.
例子3:动态实数数组
(:i,j,m,n,a,s)=
{
a=new(reals,3,10), //定义3×10实数数组(矩阵)
len(a,0,&m,&n), //获得数组维数大小
s=0.0, i=0, while{i<m,
j=0, while{j<n, a(i,j)=1.0, s=s+a(i,j), j++}, //将数组的每一个元素都设为1.0,并将数组的所有元素都加起来
i++
},
s //返回相加后的值
};
结果:
30.
Lu静态整数数组用luStaData_intarray标识,静态实数数组用luStaData_realarray标识,动态整数数组用luDynData_intarray标识,动态实数数组用luDynData_realarray标识。详细参考Lu编程指南。
参考C格式的头文件lu32.h,Lu动态数组结构定义如下:
//luDynData_intarray(动态整数数组,多维数组采用C/C++格式存取)
struct luIntArray
{
luIFOR *Array; //数组缓冲区,不会为NULL
luVOID ArrayLen; //数组缓冲区长度
luVOID *Dim; //数组维数,不会为NULL,实际长度最少为2,以便于将一维数组转换为矩阵
luVOID DimLen; //数组维数长度
};
//luDynData_realarray(动态实数数组,多维数组采用C/C++格式存取)
struct luRealArray
{
double *Array; //数组缓冲区,不会为NULL
luVOID ArrayLen; //数组缓冲区长度
luVOID *Dim; //数组维数,不会为NULL,实际长度最少为2,以便于将一维数组转换为矩阵
luVOID DimLen; //数组维数长度
};
动态对象使用前要验证,设pInt是一个luIntArray类型的指针,验证方法为:
SearchKey((char *)&pInt, sizeof(luVOID), luIntArray); //返回指向键值(动态对象)的指针,或者返回NULL。
Lu静态数组实际上是Lu表达式(函数)中定义的字符串(直接在双引号"... ..."之间定义),详细参考Lu用户指南。由于Lu表达式可以动态生成或销毁,故Lu静态数组是相对静态的,在使用前也需要验证,验证函数如下:
void * _stdcall GetArray(LuData *Array,void *hFor,luVOID *Max); //C定义
用法1:
Array:Lu基本数据指针。
hFor:从二级函数获得的表达式句柄。不能使用编译表达式得到的表达式句柄。
Max:返回数组缓冲区最大长度。该参数必须为变量,不能为常量。
返回值:数组指针。返回NULL表示操作失败。
注意:只能在二级函数中使用该函数。以后会介绍这种用法。
用法2:
Array:Lu基本数据指针。
hFor:hFor=NULL。
Max:返回数组缓冲区最大长度。该参数必须为变量,不能为常量。
返回值:数组指针。返回NULL表示操作失败。
注意:数组指针应及时使用。
说明:该函数既可获得luStaData_intarray或luStaData_realarray类型的静态数组,也可获得luDynData_intarray或luDynData_realarray类型的动态数组。如果动态数组是多维的,该函数将视为一维数组。静态数组都是一维数组。
3 代码
#include <stdio.h>
#include "lu32.h"
#pragma comment( lib, "lu32.lib" )
void main(void)
{
void *hFor; //表达式句柄
luINT nPara; //存放表达式的自变量个数
LuData *pPara; //存放输入自变量的数组指针
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
int ErrCode; //错误代码
luIFOR *pInt; //Lu静态整数数组指针
double *pD; //Lu动态实数数组指针,看作一维
luRealArray *pReal; //Lu动态实数数组指针
luVOID Max; //存放数组缓冲区的大小
luVOID i,j;
wchar_t ForStr[]=L"getarray(a,b:i,k)= a=intss(\"\\&\\[6]\"), k=len(a), i=-1,while{++i<k, a[i]=i}, b=new[reals,2,3,data: 1.1,2.2,3.3,4.4,5.5,6.6].global()";//字符串表达式
if(!InitLu()) return; //初始化Lu
ErrCode=LuCom(ForStr,0,0,0,&hFor,&nPara,&pPara,&ErrBegin,&ErrEnd); //编译表达式
if(ErrCode)
{
printf("表达式有错误!错误代码: %d \n",ErrCode);
}
else
{
LuCal(hFor,pPara); //计算表达式的值
//第一个返回参数
if(pPara[0].BType==luStaData_intarray) //Lu静态整数数组
{
pInt=(luIFOR *)GetArray(pPara,NULL,&Max);
if(pInt)
{
for(i=0; i<Max; i++) printf("%I64d ",pInt[i]);
printf("\n\n");
}
}
//第二个返回参数,用GetArray获得,将多维数组看作一维数组
if(pPara[1].BType==luDynData_realarray) //Lu动态实数数组
{
pD=(double *)GetArray(pPara+1,NULL,&Max);
if(pD)
{
for(i=0; i<Max; i++) printf("%f ",pD[i]);
printf("\n\n");
}
}
//第二个返回参数,用SearchKey获得多维数组
if(pPara[1].BType==luDynData_realarray) //Lu动态实数数组
{
pReal=(luRealArray *)SearchKey((char *)&(pPara[1].x), sizeof(luVOID), luDynData_realarray);
if(pReal)
{
for(i=0; i<pReal->Dim[0]; i++)
{
for(j=0; j<pReal->Dim[1]; j++)
{
printf("%f ",pReal->Array[i*pReal->Dim[1]+j]);
}
printf("\n");
}
printf("\n\n");
}
}
}
FreeLu(); //释放Lu
}
运行结果:
0 1 2 3 4 5
1.100000 2.200000 3.300000 4.400000 5.500000 6.600000
1.100000 2.200000 3.300000
4.400000 5.500000 6.600000
4 函数说明
本例用到了Lu的6个输出函数:初始化Lu的函数InitLu,释放Lu的函数FreeLu,编译表达式的函数LuCom、计算表达式的函数LuCal、查找键值函数SearchKey、获得数组函数GetArray。从这里查看这些函数的说明:Lu编程指南。
5 难点分析
在Lu表达式中,静态数组直接在双引号"... ..."之间定义,而动态数组通常用函数new[... ...]生成。
代码中的字符串表达式定义了一个函数getarray(a,b),该函数的两个自变量被重新赋值,用于返回参数值,本例中返回了两个数组,数组a是整数静态数组,数组b是实数动态数组(2×3维矩阵),并对动态数组b使用了global函数,两个数组均进行了赋值。
6 其他
你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。
版权所有© Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com QQ:630715621
最近更新: 2013年12月31日