如何将Table(数字列表)从Lua传递到C并访问它

发布于 2024-12-15 21:11:10 字数 282 浏览 0 评论 0原文

我想将一个包含数字的列表从Lua传递到C并在C中访问它。我该怎么做?

假设我有以下表:

x = {1, 2, 3, 9, 5, 6}

我想将其发送到 C 并将该表存储在 C 中的数组中。

我使用以下方式发送它:

quicksort(x)

其中 quicksort 是我在 C 中定义的函数。

我如何访问C 中的x

I want to pass a list containing numbers from Lua to C and access it in C. How can I do it?

Suppose I have the following Table:

x = {1, 2, 3, 9, 5, 6}

I want to send it to C and store this table in array in C.

I sent it using:

quicksort(x)

where quicksort is the function I have defined in C.

How can I access the x in C?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

活雷疯 2024-12-22 21:11:10

您传递给函数的表将位于函数的堆栈中。您可以使用lua_getfieldlua_gettable对其进行索引。

使用 lua_next 遍历表格,可以如果需要,用 C 填充数组;不过,对于数组来说,只需从 1 迭代到 #t 就足够了。

一些示例实用程序代码(未经测试):

int* checkarray_double(lua_State *L, int narg, int *len_out) {
    luaL_checktype(L, narg, LUA_TTABLE);

    int len = lua_objlen(L, narg);
    *len_out = len;
    double *buff = (double*)malloc(len*sizeof(double));

    for(int i = 0; i < len; i++) {
        lua_pushinteger(L, i+1);
        lua_gettable(L, -2);
        if(lua_isnumber(L, -1)) {
            buff[i] = lua_tonumber(L, -1);
        } else {
            lua_pushfstring(L,
                strcat(
                    strcat(
                        "invalid entry #%d in array argument #%d (expected number, got ",
                        luaL_typename(L, -1)
                    ),
                    ")"
                ),
                i, narg
            );
            lua_error(L);
        }
        lua_pop(L, 1);
    }

    return buff;
}

The table you pass to the function will be on the function's stack. You can index it by using lua_getfield or lua_gettable.

Traversing the table with lua_next, you can populate your array in C if you need to; although, for an array, simply iterating from 1 to #t should suffice.

Some example utility code (untested):

int* checkarray_double(lua_State *L, int narg, int *len_out) {
    luaL_checktype(L, narg, LUA_TTABLE);

    int len = lua_objlen(L, narg);
    *len_out = len;
    double *buff = (double*)malloc(len*sizeof(double));

    for(int i = 0; i < len; i++) {
        lua_pushinteger(L, i+1);
        lua_gettable(L, -2);
        if(lua_isnumber(L, -1)) {
            buff[i] = lua_tonumber(L, -1);
        } else {
            lua_pushfstring(L,
                strcat(
                    strcat(
                        "invalid entry #%d in array argument #%d (expected number, got ",
                        luaL_typename(L, -1)
                    ),
                    ")"
                ),
                i, narg
            );
            lua_error(L);
        }
        lua_pop(L, 1);
    }

    return buff;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文