C函数返回多个参数给lua

lua通过一个运行时栈来维护参数传递及返回,使用lua_to*等函数获取lua传递到C函数的参数,使用lua_push*从C函数返回值到lua脚本。此外也可以使用lua_getglobal从C函数获取lua脚本定义的全局变量。

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

    #include <stdlib.h> /* For function exit() */
    #include <stdio.h> /* For input/output */

    void bail(lua_State *L, char *msg){
        fprintf(stderr, "\nFATAL ERROR:\n %s: %s\n\n",
            msg, lua_tostring(L, -1));
        exit(1);
    }
    int lua_func_from_c(lua_State *L)
    {
        printf("This is C\n");
        int argc = lua_gettop(L);    /* number of arguments */
        const char * str = lua_tostring(L,1);    /* the first argument: string */
        int num = lua_tonumber(L,2); /* the second argument: number */
        
        printf("The first argument: %s\n", str);
        printf("The second argument: %d\n", num);

        lua_getglobal(L,"global_var");
        const char * global_str = lua_tostring(L,-1);
        printf("global_var is %s\n", global_str);

        int the_second_ret = 2*num;
        lua_pushstring(L, "the first return");
        lua_pushnumber(L, the_second_ret);
        return 2;            /* tell lua how many variables are returned */
    }
    int main(int argc, const char *argv[])
    {
        if(argc != 2)
        {
            return 1;
        }
        lua_State *L = luaL_newstate(); 	/* Create new lua state variable */

        /* Load Lua libraries, otherwise, the lua function in *.lua will be nil */
        luaL_openlibs(L);
        
        /* register new lua function in C */
        lua_register(L, "lua_func_from_c", lua_func_from_c);

        if( luaL_loadfile(L,argv[1]) ) 	/* Only load the lua script file */
            bail(L, "luaL_loadfile() failed");

        if( lua_pcall(L,0,0,0) ) 		/* Run the loaded lua file */
            bail(L, "lua_pcall() failed");
        lua_close(L);                 	/* Close the lua state variable */    

        return 0;
    }

lua脚本(my.lua)如下所示(在lua脚本中,如果变量不用local明确声明为局部变量,则默认为全局变量):

    print("Hello world")
    global_var = "this is a global string"
    first, second = lua_func_from_c("the first one", 2)
    print("the first returned", first)
    print("the second returned", second)

执行结果:

Hello world
This is C
The first argument: the first one
The second argument: 2
global_var is this is a global string
the first returned the first return
the second returned 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值