您的位置:首页 > 编程语言 > Lua

C和lua交互

2014-02-17 11:14 253 查看

C调用LUA函数

query.c

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int main(int argc, char* argv[])
{
lua_State* L = lua_open();
luaL_openlibs(L);

luaL_dofile(L,"query.lua");   //加载脚本并实例化,相当于loadfile并pcall一次

lua_getglobal(L, "query_Id"); //加载lua脚本中的函数名
lua_pcall(L, 0, 0, 0);        //调用lua中的该函数

return 0;
}


query.lua

function query_Id()
print("Id is 111")
end
lua_pcall函数解析:http://manual.luaer.cn/lua_pcall.html
lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);

nargs is the number of arguments that you pushed onto the stack. The number of results is adjusted to
nresults.

nargs是输入参数的个数,nresults是返回值的个数。

luaL_dofile函数解析:
int luaL_dofile (lua_State *L, const char *filename);

Loads and runs the given file. It is defined as the following macro:

(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
It returns 0 if there are no errors or 1 in case of errors.

lua_getglobal函数解析:
LUA解释器的工作机制,LUA解释器自身维护一个运行时栈,通过这个运行时栈,LUA解释器向主机程序传递参数,所以我们可以通过这个运行时栈得到LUA脚本中变量的值。

lua_getglobal将LUA的一个全局变量放到栈顶。

LUA调用C函数

query.c

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

struct get_ret_data{
int exist_flag;
char ret_str[4096];
int ret_len;
};
struct get_ret_data hget_ret;

int read_dba_C(lua_State *L){
int flag = lua_tonumber(L, 1);                        //lua传递的第一个参数

lua_pushlstring(L, get_ret.ret_str, get_ret.ret_len); //返回给lua的值
lua_pushnumber(L, mem_num);                           //返回给lua的值
return 2;                                             //返回值的个数
}

int main(int argc, char* argv[])
{
lua_State* L = lua_open();
luaL_openlibs(L);

luaL_dofile(L,"query.lua");             //加载脚本并实例化,相当于loadfile并pcall一次
lua_register(L,"read_dba",read_dba_C);  //注册函数,使得lua中可以调用C函数

lua_getglobal(L, "query_Id");           //加载lua脚本中的函数名
lua_pcall(L, 0, 0, 0);                  //调用lua中的该函数

return 0;
}


query.lua

function query_Id()
local flag = 1
local buf,num = read_dba(flag)
print(buf,num)
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: