分享
 
 
 

通过例子学习Lua(6)--C/C++中用Lua函数

王朝c/c++·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

1.简介

偶们这次主要说说怎么由Lua定义函数, 然后在C或者C++中调用. 这里偶们

暂不涉及C++的对象问题, 只讨论调用函数的参数, 返回值和全局变量的使用.

2.程序

这里偶们在e12.lua里先定义一个简单的add(), x,y为加法的两个参数,

return 直接返回相加后的结果.

例e12.lua

-- add two numbers

function add ( x, y )

return x + y

end

在前一次里, 偶们说到 lua_dofile() 可以直接在C中执行lua文件. 因为偶们

这个程序里只定义了一个add()函数, 所以程序执行后并不直接结果, 效果相当

于在C中定义了一个函数一样.

Lua的函数可以有多个参数, 也可以有多个返回值, 这都是由栈(stack)实现的.

需要调用一个函数时, 就把这个函数压入栈, 然后顺序压入所有参数, 然后用

lua_call()调用这个函数. 函数返回后, 返回值也是存放在栈中. 这个过程和

汇编执行函数调用的过程是一样的.

例e13.cpp 是一个调用上面的Lua函数的例子

#include

extern "C" { // 这是个C++程序, 所以要extern "C",

// 因为lua的头文件都是C格式的

#include "lua.h"

#include "lualib.h"

#include "lauxlib.h"

}

/* the Lua interpreter */

lua_State* L;

int luaadd ( int x, int y )

{

int sum;

/* the function name */

lua_getglobal(L, "add");

/* the first argument */

lua_pushnumber(L, x);

/* the second argument */

lua_pushnumber(L, y);

/* call the function with 2

arguments, return 1 result */

lua_call(L, 2, 1);

/* get the result */

sum = (int)lua_tonumber(L, -1);

lua_pop(L, 1);

return sum;

}

int main ( int argc, char *argv[] )

{

int sum;

/* initialize Lua */

L = lua_open();

/* load Lua base libraries */

lua_baselibopen(L);

/* load the script */

lua_dofile(L, "e12.lua");

/* call the add function */

sum = luaadd( 10, 15 );

/* print the result */

printf( "The sum is %d\n", sum );

/* cleanup Lua */

lua_close(L);

return 0;

}

程序说明:

main中过程偶们上次已经说过了, 所以这次只说说luaadd的过程

* 首先用lua_getglobal()把add函数压栈

* 然后用lua_pushnumber()依次把x,y压栈

* 然后调用lua_call(), 并且告诉程序偶们有两个参数一个返回值

* 接着偶们从栈顶取回返回值, 用lua_tonumber()

* 最后偶们用lua_pop()把返回值清掉

运行结果:

The sum is 25

编译方法

Linux下把程序存成e13.cpp

g++ e13.cpp -llua -llualib -o e13

./e13

VC下编译方法

* 首先建立一个空的Win32 Console Application Project

* 把e13.cpp加入工程中

* 点project setting,然后设置link选项, 再加上lua.lib lualib.lib两个额外的库

* 最后编译

建立好的project可以在这里下载

VC http://tonyandpaige.com/tutorials/luaadd.zip

Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz

3.全局变量

上面偶们用到了lua_getglobal()但并没有详细讲, 这里偶们再举两个小例子来说下全局变量

lua_getglobal()的作用就是把lua中全局变量的值压入栈

lua_getglobal(L, "z");

z = (int)lua_tonumber(L, 1);

lua_pop(L, 1);

假设Lua程序中定义了一个全局变量z, 这段小程序就是把z的值取出放入C的变量z中.

另外Lua中还有一个对应的函数lua_setglobal(), 作用是用栈顶的值填充指定的全局变量

lua_pushnumber(L, 10);

lua_setglobal(L, "z");

例如这段小程序就是把lua中的全局变量z设为10, 如果lua中未定义z的话, 就会自动创建一个

全局变量z并设为10.

4.试试看

自己写个函数用C/C++来调用下试试

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有