欢迎访问 Lu程序设计

C/C++使用Lu脚本数组

1 说明

    要演示本文的例子,你必须下载Lu64脚本系统。本文的例子需要lu64.dll、lu64.lib、C格式的头文件lu64.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格式的头文件lu64.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_intarrayluStaData_realarray类型的静态数组,也可获得luDynData_intarrayluDynData_realarray类型的动态数组。如果动态数组是多维的,该函数将视为一维数组。静态数组都是一维数组。

3 代码

#include <stdio.h>
#include "lu64.h"

#pragma comment( lib, "lu64.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-2021,保留所有权利
E-mail: forcal@sina.com
  QQ:630715621
最近更新: 2021年05月23日