如何将c代码函数添加到lua文件中,反之亦然

w8rqjzmb  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在寻找一种方法,能够在我的c代码中读取lua的主函数。
我还在寻找一种方法将C函数传递给lua
在我的示例代码中,LoadTBL是来自C代码的函数

TBL = 
{
    { Init,     0, 15, 00 },
    { End,      1, 16, 00 }
}

function main()

    for key, value in pairs(TBL) do
        result, msg = LoadTBL(value[1], value[2], value[3]);
        if( not result ) then return false, msg;
        end
    end
        
    return true, "success";
end

C代码:

int LoadTBL (int val1, int val2, int val3) {
    ....
    return 0;
}

void read_test(void) {
    lua_State *L;
    L = luaL_newstate();
    luaL_openlibs(L);

    if (luaL_loadfile(L, "test.lua") || lua_pcall(L, 0, 0, 0))
    {
        printf("Error 'test.lua'\n");
        return;
    }

    lua_close(L);
    printf("Read complete.\n");

}

其思想是创建可以与C代码交互的luas脚本

qyswt5oh

qyswt5oh1#

您将需要花更多的时间阅读有关Lua C API的内容。
下面是一个C程序的例子,或者叫 host,它创建一个Lua状态,注册一个全局函数,并执行一个Lua文件。一旦文件执行完毕,宿主程序就获得全局Lua值main,并尝试调用它。如果成功,宿主程序就从堆栈中读取返回值,并打印它们。
注意C函数是如何定义为lua_CFunction的,以及如何与Lua堆栈交互的。
我不确定您期望这个LoadTBL函数做什么,因此出于演示的目的,下面这个函数检查它的所有参数是否都是整数,并且可以被整除。
main.c

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

void die(lua_State *L, const char *msg)
{
    fprintf(stderr, "%s: %s\n", msg, lua_tostring(L, -1));
    lua_close(L);
    exit(EXIT_FAILURE);
}

int loadTBL(lua_State *L)
{
    int n = lua_gettop(L);
    int even = 1;

    for (int i = 1; i <= n; i++) {
        if (!lua_isinteger(L, i) || (lua_tointeger(L, i) % 2 != 0)) {
            even = 0;
            break;
        }
    }

    lua_pushboolean(L, even);
    lua_pushstring(L, "some message");
    return 2;
}

int main(void)
{
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    lua_register(L, "LoadTBL", loadTBL);

    if (LUA_OK != luaL_dofile(L, "test.lua"))
        die(L, "dofile");

    lua_getglobal(L, "main");

    if (LUA_OK != lua_pcall(L, 0, 2, 0))
        die(L, "calling main");

    printf("GOT <%d>[%s]\n", lua_toboolean(L, -2), lua_tostring(L, -1));
    lua_close(L);
}

test.lua

local TBL = {
    { 0, 15, 0 },
    { 1, 16, 0 }
}

function main()
    for key, value in pairs(TBL) do
        local result, msg = LoadTBL(value[1], value[2], value[3])

        if not result then
            return false, msg
        end
    end

    return true, "success"
end

相关问题