gpt4 book ai didi

c - 在 lua 和 C 之间共享数组

转载 作者:太空狗 更新时间:2023-10-29 17:05:26 31 4
gpt4 key购买 nike

我真的用谷歌搜索了这个问题,但我从来没有真正找到解决方案。

我想在 C 和 Lua 之间共享一个数组,为了性能,我将避免在 Lua 之间复制数组。

所以我想将指向数组的指针从 C 传递给 Lua。然后我想从 Lua 直接设置/修改这个数组中的值。


C 代码示例

我想定义我的数组

int mydata[] = {1,2,3,4} 

将它设置为全局,以便从名称为 mydata 的 Lua 访问它。


在 Lua 中

我想像这样改变值

mydata[3] = 9

当我返回到 C 时,mydata[3] 是 9,因为它是一个指向数组的指针。

这怎么可能?

最佳答案

您可以通过userdata 将任意数据公开给Lua。如果你给你的用户数据值一个元表,你可以为这些用户数据定义各种运算符/操作的行为。在这种情况下,我们想向 Lua 公开一个数组,并定义在 array[index]array[index] = value 的情况下要做什么。

我们通过创建一个足够大的用户数据缓冲区来保存数组的地址,从而将数组暴露给 Lua。我们通过使用 __index__newindex 方法创建元表来定义索引/分配行为。

下面是一个完整的工作示例,它向 Lua 公开了一个静态数组。您的程序可能会有一些其他调用将数组返回给 Lua。请注意,根本没有边界检查;如果您尝试在数组边界之外进行索引,您将会崩溃。为了使其更健壮,您需要将用户数据更改为具有数组指针和数组大小的结构,以便进行边界检查。

#include "lauxlib.h"

// metatable method for handling "array[index]"
static int array_index (lua_State* L) {
int** parray = luaL_checkudata(L, 1, "array");
int index = luaL_checkint(L, 2);
lua_pushnumber(L, (*parray)[index-1]);
return 1;
}

// metatable method for handle "array[index] = value"
static int array_newindex (lua_State* L) {
int** parray = luaL_checkudata(L, 1, "array");
int index = luaL_checkint(L, 2);
int value = luaL_checkint(L, 3);
(*parray)[index-1] = value;
return 0;
}

// create a metatable for our array type
static void create_array_type(lua_State* L) {
static const struct luaL_reg array[] = {
{ "__index", array_index },
{ "__newindex", array_newindex },
NULL, NULL
};
luaL_newmetatable(L, "array");
luaL_openlib(L, NULL, array, 0);
}

// expose an array to lua, by storing it in a userdata with the array metatable
static int expose_array(lua_State* L, int array[]) {
int** parray = lua_newuserdata(L, sizeof(int**));
*parray = array;
luaL_getmetatable(L, "array");
lua_setmetatable(L, -2);
return 1;
}

// test data
int mydata[] = { 1, 2, 3, 4 };

// test routine which exposes our test array to Lua
static int getarray (lua_State* L) {
return expose_array( L, mydata );
}

int __declspec(dllexport) __cdecl luaopen_array (lua_State* L) {
create_array_type(L);

// make our test routine available to Lua
lua_register(L, "array", getarray);
return 0;
}

用法:

require 'array'

foo = array()
print(foo) -- userdata

-- initial values set in C
print(foo[1])
print(foo[2])
print(foo[3])
print(foo[4])

-- change some values
foo[1] = 2112
foo[2] = 5150
foo[4] = 777

-- see changes
print(foo[1])
print(foo[2])
print(foo[3])
print(foo[4])

关于c - 在 lua 和 C 之间共享数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689135/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com