Calling Lua function from C++

Calling Lua function from c++ is very simple. Value passing between c++ and Lua goes through stack, Lua C API provides a convenience ways for you to call Lua function from C. To call Lua function, you need to specify:

1. Function Name.
2. Parameters of function call.
3. Return values expected ( Lua function support multiple results reture)

Let say my lua function name call f in last.lua, takes 2 parameters.

-- last.lua
function f (x, y)
    return (x^2 * math.sin(y))/(1 - x)
end

I perform function call from c++ like this:

01//last.cc
02# extern "C" {
03# #include "lua.h"
04# #include "lualib.h"
05# #include "lauxlib.h"
06# } 
07 
08int main()
09{
10    double z;
11    lua_State *L = lua_open();
12    luaL_openlibs(L);
13    if (luaL_loadfile(L, "last.lua") || lua_pcall(L, 0, 0, 0)) {
14        printf("error: %s", lua_tostring(L, -1));
15        return -1;
16    }
17 
18    lua_getglobal(L, "f");
19    if(!lua_isfunction(L,-1))
20    {
21        lua_pop(L,1);
22        return -1;
23    }
24    lua_pushnumber(L, 21);   /* push 1st argument */
25    lua_pushnumber(L, 31);   /* push 2nd argument */
26 
27    /* do the call (2 arguments, 1 result) */
28    if (lua_pcall(L, 2, 1, 0) != 0) {
29        printf("error running function `f': %s/n",lua_tostring(L, -1));
30        return -1;
31    }
32 
33    /* retrieve result */
34    if (!lua_isnumber(L, -1)) {
35        printf("function `f' must return a number/n");
36        return -1;
37    }
38    z = lua_tonumber(L, -1);
39    printf("Result: %f/n",z);
40    lua_pop(L, 1);
41    lua_close(L);
42 
43    return 0;
44}

Compile it with g++ like this:

g++ -o last{,.cc} -llua -ldl

The results:

Result: -12.158958

Brief explanation of the C++ codes above:
First, I trigger lua_getglobal to get the function name, then I push 2 parameters to stack. I make lua_pcall by telling Lua I have 2 params and expect 1 value return. Upon success, I retrieve the return value from the top of the stack.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值