C调用lua文件中函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C调用lua文件中函数相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
extern "C"
#include <lua/lua.h>
#include <lua/lualib.h>
#include <lua/lauxlib.h>
;
int main()
lua_State *m_pState = luaL_newstate();

luaL_openlibs(m_pState);
luaL_dofile(m_pState,"E:\work\Sample.lua");

lua_getglobal(m_pState,"add");
lua_pushnumber(m_pState,1);
lua_pushnumber(m_pState,2);
printf("%d \n",(int)lua_tonumber(m_pState,1));
lua_pcall(m_pState,2,1,0);
printf("%d \n",(int)lua_tonumber(m_pState,-1));
lua_pop(m_pState,1);
lua_close(m_pState);

//getchar();
return 0;


Sample.lua
function add (x,y)
return x + y;
end;

VS2008 中,结果输出是2 0,第二个结果 为什么不是3 ,需要配置什么嘛

在C中调用Lua函数的API主要由以下几个:
(1)void lua_call (lua_State *L, int nargs, int nresults);
函数调用,nargs表示参数的个数,nresults表示返回值的个数
首先将lua函数压栈,然后将参数依次压栈,最后调用函数即可
函数调用时,参数和函数都会pop出栈,调用返回后,结果会push进栈
nresults==LUA_MULTRET,所有的返回值都会push进栈
nresults!=LUA_MULTRET,返回值个数根据nresults来调整
Lua语句:
a = f("how", t.x, 14)
在C中的实现:
lua_getglobal(L, "f");        // 函数入栈
lua_pushstring(L, "how");     // 参数1入栈
lua_getglobal(L, "t");       // 表t入栈
lua_getfield(L, -1, "x");      // 参数2入栈
lua_remove(L, -2);        // 跳t出栈
lua_pushinteger(L, 14);     // 参数3入栈
lua_call(L, 3, 1);        // 调用函数,参数和函数都会出栈
lua_setglobal(L, "a");     // 给a赋值,栈顶出栈
上述代码执行完毕后,堆栈状态恢复原样。
(2)int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
函数调用,在安全模式下,并且可以添加错误处理函数。
如果调用期间发生error,lua_pcall会捕获之,然后push stack一个错误信息(会先将函数和参数pop出栈),并且返回一个error code(非0的一个值)。
发生error时,如果指定了错误处理函数,会在error message入栈前调用错误处理函数,具体由msgh参数来决定:
(1)msgh==0,不指定错误处理函数,入栈信息不变;
(2)msgh!=0,msgh表示错误处理函数的堆栈index,错误处理函数会以error message为参数,并将返回的新的error
message入栈。主要用来给error
message添加  更多的debug信息,比如堆栈跟踪,因为这些信息在pcall调用完之后是收集不到的。
函数返回代码:
LUA_OK(0):调用成功
LUA_ERRRUN:runtime error
LUA_ERRMEM:内存分配错误,这种情况下不会调用错误处理函数
LUA_ERRERR:调用错误处理函数时出错,当然,不会再进一步调用错误处理函数
LUA_ERRGCMM:调用metamethod.__gc时报错,由gc引起,和函数本身没关系
(3)int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k);
函数调用,在安全模式下,并且允许函数yield。
参考技术A 你使用的是哪个lua 版本????
我用的是 lua 5.2 ,在 codeblock 下编译的。
你的描述和源代码不符合。

printf("%d \n",(int)lua_tonumber(m_pState,1));

应该显示 0 。
lua堆栈中
index 1 => add函数
index 2 => 1
index 3 => 2
所以那句代码试图把lua函数转换成为数字。应该得到0 。
后面一句应该得到3 。
你说你的结果是 2 0 。应该不会。除非你贴出来的代码,和实际编译的代码不同。追问

代码没有问题,就是这样,第二个结果确实是0,lua库是公司给的,在VS08下执行的程序, 可能是环境安装问题吧, 等我换个机器再试试. 你执行的结果是3吗?

追答

是的 。 第二个值是3.

本回答被提问者采纳

以上是关于C调用lua文件中函数的主要内容,如果未能解决你的问题,请参考以下文章

如何用Lua.EXE调用Lua文件啊?

Lua中调用C函数

Lua中调用C函数(lua-5.2.3)

快速掌握Lua 5.3 —— 从Lua中调用C函数

lua调用C语言

如何在lua中设置文件写入函数调用的长度?