函数堆栈C++中调用lua脚本文件

近期一直在查找函数堆栈之类的问题,今天正好有机会和大家共享一下.

    想要在C++中用调lua脚本文件中的函数比较简略,因为lua脚本是通过堆栈来和C\C++来停止据数互交的,
所以理原也很简略,只要需先把lua脚本的函数压入到堆栈中
接着再把这个函数所要需的参数也以从左到右的次序压入到堆栈中,
然后就能够执行这个函数了
函数执行后,就会动自删除刚才被我们压入到堆栈中的据数,然后将函数的返回值压入到堆栈
理原就这样,不过就是通过堆栈来停止据数互交
 
先来看一段小序程:
这段序程将演示如何从lua脚本文件中用调全局量变

void main()
{
lua_State* pluaState=luaL_newstate();
luaL_openlibs(pluaState);
//执行Lua脚本
luaL_dofile(pluaState,"../Script/test.lua");
 
//将脚本文件中的Pi量变压入堆寨
lua_getglobal(pluaState,"Pi");
cout<<"读取lua脚本的Pi量变:"<<(float)lua_tonumber(pluaState,1)<<endl;
lua_pop(pluaState,1);
 
//释放资源
lua_close(pluaState);
getchar();
}

    ---------------------------------------------------------以下是lua脚本文件-------------------------------------------------------------------------------
--就只有一行代码,定义了一个全局量变pi
Pi=3.1415926

    面上这段序程加粗部份的地方就是现实这个功能的代码
函数lua_getglobal()是用来将lua脚本文件中的全局量变压入到堆栈中,这个函数有两个参数,第一个参数是lua的状态机(于用存储据数),
第二个参数是你想获得的全局量变的名称标识符..

    函数lua_tonumber()是读取堆栈指定位置的据数并且转换为数值型,这个函数的第一个参数是lua的状态机,第二个参数是要读取的据数的位置
最后我们将读取出来的据数接着转换为浮点型据数,通过cout打印到控制台..

    最后一个函数lua_pop()无关紧要,但是为了当前便方续继和lua堆栈中的据数停止互交作操,最好还是用调一下这个函数..
这个函数的功能是删除堆栈中指定位置的据数

    每日一道理
爱,有的时候不要需山盟海誓的承诺,但她一定要需细致入微的关怀与问候;爱,有的时候不要需梁祝化蝶的悲壮,但她一定要需心有灵犀的默契与投合;爱,有的时候不要需雄飞雌从的追随,但她一定要需相濡以沫的支持与理解。

    用调lua脚本中的函数和用调lua脚本文件中的全局量变相似,少至理原一样,但稍有不同
用以下代码替换之前黑体字部份的代码,其余变不

//用调lua脚本中的函数
lua_getglobal(pluaState,"Add");   
lua_pushnumber(pluaState,1);
lua_pushnumber(pluaState,1);
lua_call(pluaState,2,1);
cout<<"1+1="<<(int)lua_tonumber(pluaState,1)<<endl;
lua_pop(pluaState,1);

    
-----------------------------------------------------------以下是脚本文件-----------------------------------------------------------
--函数,这个函数分十简略,就是现实加法算运,返回两个数相加的结果
function Add(intX,intY)
return intX+intY;
end-----------------------------------------------------------以下是脚本文件-----------------------------------------------------------

    以上这段C++序程:
lua_getglobal(pluaState,"Add");这个函数将lua脚本中的Add()函数压入堆栈中
lua_pushnumber(pluaState,1);这个函数将指定的数值型据数压入到堆栈中
lua_pushnumber(pluaState,1);同上
lua_call(pluaState,2,1);执行刚才被压入堆栈中的函数,这个函数最后两个参数分别是参数的数量和返回值的数量
函数执行后会删除本来被压入到堆栈中的据数,接着会把返回值压入到堆栈
cout<<"1+1="<<(int)lua_tonumber(pluaState,1)<<endl;
lua_pop(pluaState,1);
以上这两段代码就是现将堆栈中的返回值出输,然后将他删除,,便方当前续继和lua堆栈停止据数互交

 

    
 

文章结束给大家分享下程序员的一些笑话语录: 真正的程序员喜欢兼卖爆米花,他们利用CPU散发出的热量做爆米花,可以根据米花爆裂的速度听出正在运行什么程序。

posted @ 2013-04-25 19:49  坚固66  阅读(405)  评论(0编辑  收藏  举报