C/C++注册动态对象到Lu系统并进行运算符重载(二)

2014-11-24 07:38:58 · 作者: · 浏览: 7
tor)); if(!pVector0) goto err; //在Lu键树中注册键值,参数-1表示注册为指针键,下同 if(InsertKey((char *)&pVector0,-1,key_Vector,pVector0,Del_Vector,NULL,0,NowKey)) { free(pVector0); goto err; } } pVector0->x = pVector1->y*pVector2->z - pVector1->z*pVector2->y; pVector0->y = pVector1->z*pVector2->x - pVector1->x*pVector2->z; pVector0->z = pVector1->x*pVector2->y - pVector1->y*pVector2->x; FunReObj(vFor); //通知Lu,该函数将返回一个动态对象 a.BType=key_Vector; a.VType=key_Vector; a.x=0; *(luVOID *)&(a.x)=(luVOID)pVector0; return a; } err: //简化的运行错误处理,实用中要区分错误的不同类型,以方便用户查找错误来源,下同 a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0; SetRunErr(1,ErrName,1,0,vFor); return a; } //演示二级函数如何通过参数返回多个动态对象,注册到Lu脚本系统 //用法:addsub[a,b,&c,&d],其中a和b是两个Vector对象,c返回a+b,d返回a-b LuData _stdcall Vector_addsub(luINT mm,LuData *xx,void *vFor) //计算两个Vector的和与差,返回两个新Vector { static wchar_t ErrName[]=LVector addsub; lu_Vector *pVector0,*pVector00,*pVector1,*pVector2; void *NowKey=NULL; //为避免编译器发出警告进行初始化,实际上不需要 char keyname[sizeof(luVOID)]; LuData a; if(xx->BType==key_Vector && (xx+1)->BType==key_Vector) { pVector1=(lu_Vector *)SearchKey((char *)&(xx[0].x), sizeof(luVOID), key_Vector); pVector2=(lu_Vector *)SearchKey((char *)&(xx[1].x), sizeof(luVOID), key_Vector); if(!pVector1 || !pVector2) goto err; pVector0=(lu_Vector *)GetBufObj(key_Vector,keyname); //先尝试从缓冲区中获取一个Vector对象 if(!pVector0) { pVector0=(lu_Vector *)malloc(sizeof(lu_Vector)); if(!pVector0) goto err; if(InsertKey((char *)&pVector0,-1,key_Vector,pVector0,Del_Vector,NULL,0,NowKey)) //在Lu键树中注册键值 { free(pVector0); goto err; } } pVector00=(lu_Vector *)GetBufObj(key_Vector,keyname); //先尝试从缓冲区中获取一个Vector对象 if(!pVector00) { pVector00=(lu_Vector *)malloc(sizeof(lu_Vector)); if(!pVector00) { DeleteKey((char *)&pVector0,sizeof(luVOID),key_Vector,Del_Vector,1); //在Lu键树中删除键值,参数1表示先放到缓冲区中 goto err; } if(InsertKey((char *)&pVector00,-1,key_Vector,pVector00,Del_Vector,NULL,0,NowKey)) //在Lu键树中注册键值 { free(pVector0); DeleteKey((char *)&pVector0,sizeof(luVOID),key_Vector,Del_Vector,1); //在Lu键树中删除键值,参数1表示先放到缓冲区中 goto err; } } pVector0->
x = pVector1->x + pVector2->x; pVector0->y = pVector1->y + pVector2->y; pVector0->z = pVector1->z + pVector2->z; pVector00->x = pVector1->x - pVector2->x; pVector00->y = pVector1->y - pVector2->y; pVector00->z = pVector1->z - pVector2->z; FunSaveObj(vFor,NULL,xx); //通知Lu,准备用参数返回动态对象 xx[2].BType=key_Vector; xx[2].VType=key_Vector; xx[2].x=0; *(luVOID *)&(xx[2].x)=(luVOID)pVector0; FunSaveObj(vFor,xx+2,xx); //通知Lu,参数3返回动态对象:两个Vector的和 xx[3].BType=key_Vector; xx[3].VType=key_Vector; xx[3].x=0; *(luVOID *)&(xx[3].x)=(luVOID)pVector00; FunSaveObj(vFor,xx+3,xx); //通知Lu,参数4返回动态对象:两个Vector的差 //提示:如果还要通过返回值返回一个动态对象,仍然使用FunReObj函数,本例未通过返回值返回动态对象 return *xx; } err: a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0; SetRunErr(1,ErrName,1,0,vFor); return a; } //演示重载函数new的用法,通过函数重载调用。new[Vector]可生成一个Vector动态对象 LuData _stdcall Vector_new(luINT mm,LuData *xx,void *vFor) //生成一个Vector对象 { static wchar_t ErrName[]=LVector new; lu_Vector *pVector0; void *NowKey=NULL; //为避免编译器发出警告进行初始化,实际上不需要 char keyname[sizeof(luVOID)]; LuData a; pVector0=(lu_Vector *)GetBufObj(key_Vector,keyname); //先尝试从缓冲区中获取一个Vector对象 if(!pVector0) { pVector0=(lu_Vector *)malloc(sizeof(lu_Vector)); if(!pV