C语言调用Lua脚本并传入结构体

直接看代码,代码中有相关注释。

c-lua-struct.c

#include 
#include 
#include 
#include 
#include 
#include 

/* 结构体定义 */
typedef struct
{
    int x;
    int y;
    char *str;
}TData;

int call_lua_fun(lua_State *L, int a, int b)
{
    /* 初始化结构体 */
    TData data;
    data.x = a;
    data.y = b;
    data.str = malloc(10);
    memset(data.str, 'c', 9);
    data.str[9] = '\0';

    /* 获取Lua脚本中函数名为“fun”的函数并压入栈中 */
    lua_getglobal(L, "fun");

    /* 创建一个新的table并压入栈中 */
    lua_newtable(L);
    /* 第一个操作数入栈,int类型可以用lua_pushinteger或lua_pushnumber */
    lua_pushinteger(L, data.x);
    /*
     * 将值设置到table中,Lua脚本中可以用“.a”获取结构体x成员的值
     * 第三个参数的值可以随便取,只要和Lua脚本中保持一致即可
     */
    lua_setfield(L, -2, "a");
    /* 第二个操作数入栈 */
    lua_pushnumber(L, data.y);
    lua_setfield(L, -2, "b");
    /* 第三个操作数入栈,char*用lua_pushstring */
    lua_pushstring(L, data.str);
    lua_setfield(L, -2, "s");

    /*
     * 调用函数,调用完成后,会将返回值压入栈中
     * 第二个参数表示入参个数,第三个参数表示返回结果个数
     */
    lua_pcall(L, 1, 1, 0);
    /* 获取栈顶元素(结果) */
    int sum = (int)lua_tonumber(L, -1);
    /* 清除堆栈、清除计算结果 */
    lua_pop(L, 1);

    return sum;
}

int main(int argc, char *argv[])
{
    /* 新建Lua解释器 */
    lua_State *L = luaL_newstate();
    /* 载入Lua基本库 */
    luaL_openlibs(L);
    /* 运行脚本fun.lua */
    luaL_dofile(L, "fun.lua");
    printf("%d\n", call_lua_fun(L, 5, 6));
    
    /* 清除Lua */
    lua_close(L);
    return 0;
}

fun.lua

function fun(x)
    print(type(x))
    print("s=[" .. x.s .. "]")
    return x.a + x.b;
end

编译命令

gcc c-lua-struct.c -o c-lua-struct -I /usr/local/include/luajit-2.0 -llua-5.1 -L /usr/lib64/

运行

./c-lua-struct

输出结果

table
s=[ccccccccc]
11

你可能感兴趣的:(C语言调用Lua脚本并传入结构体)