欢迎访问 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