C/C++使用Lu脚本字符串键树(一)

2014-11-24 07:33:53 · 作者: · 浏览: 0

欢迎访问 Lu程序设计

C/C++使用Lu脚本字符串键树

1 说明

要演示本文的例子,你必须下载Lu32脚本系统。本文的例子需要lu32.dll、lu32.lib、C格式的头文件lu32.h,相信你会找到并正确使用这几个文件。

用C/C++编译器创建一个控制台应用程序,复制本文的例子代码直接编译运行即可。

2 关于Lu字符串键树

参考Lu编程指南,在Lu中,表达式、常量、函数、任意自定义数据等等,所有的东西都放到一棵键树中。Lu键树保存数据的格式如下(数据与键的名称、长度、类型是一一对应的关系):

KeyStr:键的名称(char *KeyStr)。区分大小写,可包含任意字符,包括NULL('\0')。
ByteNum:键的长度(luINT ByteNum)。ByteNum>0。
KeyType:键的类型(luKEY KeyType)。

键的类型KeyType有两种:公有键(KeyType>=luPubKey_User)和私有健(KeyType<=luPriKey_User)。

Lu所支持的程序可能很复杂,程序可以动态加载许多功能模块,每一个模块都可以向Lu键树注册数据,若注册为公有键,则该键可以被任意的功能模块所删除;若注册为私有健,则只有自己可以删除该键。

键的类型可以用函数LockKey加锁。锁定键的类型后,该键只能存储一种数据类型。如果没有锁定键的类型,则该键可以存储任意多种类型的数据。

公有键luPubKey_User和私有健luPriKey_User用来存放一些约定的键,不能加锁。例如,核心库约定使用如下函数输出信息:

typedef void (_stdcall * luMessage) (wchar_t *); //显示Lu信息的函数指针

主程序或其他模块,需设计如下输出信息的函数:

void _stdcall LuMessage(wchar_t *pWStr) //输出Lu信息,该函数注册到Lu,由Lu及二级函数调用
{
... ...
}

然后将该函数用InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v)注册到Lu(注意,使用的是公有键luPubKey_User)。约定Lu及所有二级函数都使用该函数显示信息。任一线程均可根据需要设置该函数。查询该函数的方法为:

luMessage pMessage=(luMessage)SearchKey("\0\0\0\0",4,luPubKey_User);

Lu键的类型如表1所示。

表1 Lu键的类型

类别 键的类型 标识符 生成对象 查询对象 销毁对象 说明
系统

255~-199

        系统使用。
-128~-255 -200 luPriKey_UserSearch       用户可查询和删除的私有健最大值 键的类型由系统定义,但用户可以使用。键的类型均被锁定。都是动态数据类型,即系统定义的动态数据类型。
-252 luDynData_realarray NewSysObj SearchKey/GetArray DeleteKey 动态64位实数数组
-253 luDynData_intarray NewSysObj SearchKey/GetArray DeleteKey 动态64位整数数组
-254 luDynData_string NewSysObj SearchKey/GetStr DeleteKey 动态字符串
-255 luDynData_lu NewSysObj SearchKey DeleteKey 动态Lu数据
用户键 256 luPubKey_User InsertKey/GetBufObj SearchKey DeleteKey 公有键。用来存放一些约定的键。不能加锁。
-256 luPriKey_User InsertKey/GetBufObj SearchKey DeleteKey 私有键。用来存放一些约定的键。不能加锁。
> 256 > luPubKey_User InsertKey/GetBufObj SearchKey DeleteKey 由用户定义的公有键。均大于256。可加锁。
< -256 < luPriKey_User InsertKey/GetBufObj SearchKey DeleteKey 由用户定义的私有键。均小于-256。可加锁。
-1073741824 luPoiKey_User InsertKey/GetBufObj SearchKey DeleteKey 指针键最小值。小于luPoiKey_User的非指针键只有自己可以销毁。指针键不仅要求键的类型KeyType>=luPoiKey_User,而且要求用InsertKey插入键时键的长度为4,但一定要取-1。

如果用C/C++设计一个较大的程序,该程序允许加载许多来自不同的人用不同的语言设计的模块,Lu键树对私有数据的保护功能将会大有用武之地。

虽然Lu键树是为Lu脚本系统设计的,但实际上Lu键树可用单独使用。本例C/C++使用Lu键树管理数据的例子,并没有使用Lu脚本表达式(函数)的编译运算功能。

本文的例子中,代码1演示了公有键(KeyType>=luPubKey_User)的用法;代码2演示了指针型私有键(KeyType>=luPoiKey_User)的用法;代码3演示了非指针型私有键(KeyType

3 代码

代码1:演示公有键

#include 
  
   
#include 
   
     #include "lu32.h" #pragma comment( lib, "lu32.lib" ) int kkk; //为避免编译器优化而设置 typedef struct pub_k //将注册为公有键 { int k; } pub_k; void _stdcall Del_pub_k(void *me) //销毁pub_k的函数 { free(me); } typedef struct pub_d //将注册为公有键 { double d; } pub_d; void _stdcall Del_pub_d(void *me) //销毁pub_d的函数 { kkk=0; //避免编译器将Del_pub_d和Del_pub_k优化为同一个函数 free(me); } LuData _stdcall OpLock_pub_d(luINT m,LuData *Para,void *hFor,int theOperator) //pub_d的运算符重载函数 { LuData a; a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0; //不对pub_d类型的对象做运算,总返回nil return a; } #define key_no_lock luPubKey_User+10 //不对该公有键加锁 #define key_lock luPubKey_User+20 //将对该公有键加锁 void main(void) { pub_k *pk; pub_d *pd; void *NowKey=NULL; //为避免编译器发出警告进行初始化,实际上不需要 if(!InitLu()) return; //初始化Lu pk=(pub_k *)malloc(sizeof(pub_k)); pk->k=10; pd=(pub_d *)malloc(sizeof