我正在寻找一种方法,能够在我的c代码中读取Lua的main函数.

我还在寻找一种将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");

}

我们的 idea 是创建可以与C代码交互的Luas脚本

推荐答案

你会想要花更多的时间阅读关于Lua C API的内容.

下面是一个创建Lua状态registers a global function并执行Lua文件的C程序(即host)的示例.一旦文件执行完毕,主机程序gets the global Lua valuemain就try 调用它.如果成功,则主机reads the return values从堆栈中取出,并打印它们.

注意C函数如何被定义为lua_CFunction,并与Lua堆栈交互.

我不确定您希望这个LoadTBL函数做什么,所以出于演示的目的,下面的函数判断它的所有参数are integers和是否可整除.

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

C++相关问答推荐

球体—立方体重叠:无、部分或全部?

有没有可能我不能打印?(C,流程)

为什么我一直收到分段错误?

在列表中插入Int指针(C)

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

CSAPP微型shell 实验室:卡在sigprocmask

C指针概念分段故障

如何使用_newindex数组我总是得到错误的参数

使用TCL C API导航到列表中的元素

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

覆盖读取函数,但当文件描述符为3或4时,我有问题

如何将大写/小写土耳其字母相互转换?

生产者消费者计数器意外输出的C代码

int * 指向int的哪个字节?

如何逐位读取二进制文件?

GETS()在C++中重复它前面的行

如何在C中计算包含递增和递减运算符的逻辑表达式?

如何使用 VLA 语法使用 const 指针声明函数

为什么需要struct in_addr

将字节/字符序列写入标准输出的最简单形式