C调用lua文件中函数
#include<stdio.h>extern"C"{#include<lua/lua.h>#include<lua/lualib.h>#include<lua/laux...
#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 ,需要配置什么嘛 展开
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。
(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。
展开全部
你使用的是哪个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 。应该不会。除非你贴出来的代码,和实际编译的代码不同。
我用的是 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.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |