在lua和C之间共享数组
我真的在谷歌上搜索过这个问题,但我从未真正找到解决办法 我想在C和Lua之间共享一个数组,为了提高性能,我将避免在Lua之间复制数组 所以我想把一个指向数组的指针从C传递到Lua。然后从Lua我想直接设置/修改这个数组中的值在lua和C之间共享数组,c,lua,lua-table,C,Lua,Lua Table,我真的在谷歌上搜索过这个问题,但我从未真正找到解决办法 我想在C和Lua之间共享一个数组,为了提高性能,我将避免在Lua之间复制数组 所以我想把一个指向数组的指针从C传递到Lua。然后从Lua我想直接设置/修改这个数组中的值 C代码中的示例 我想定义我的数组 int mydata[] = {1,2,3,4} 将其设置为全局,以使用名称mydata从Lua访问它 在Lua中 我想像这样更改值 mydata[3] = 9 当我返回C时,mydata[3]是9,因为它是指向数组的指针 这是怎
C代码中的示例 我想定义我的数组
int mydata[] = {1,2,3,4}
将其设置为全局,以使用名称mydata
从Lua访问它
在Lua中 我想像这样更改值
mydata[3] = 9
当我返回C时,mydata[3]
是9,因为它是指向数组的指针
这是怎么可能的?您可以通过
userdata
向Lua公开任意数据。如果给userdata值一个元表,则可以定义这些userdata上的各种运算符/操作的行为。在本例中,我们希望将一个数组公开给Lua,并定义在array[index]
和array[index]=value
的情况下要做什么
我们通过创建一个足够大的userdata缓冲区来保存数组的地址,从而将数组公开给Lua。我们通过使用\uuu index
和\uu newindex
方法创建一个元表来定义索引/赋值行为
下面是一个向Lua公开静态数组的完整工作示例。您的程序可能会有一些其他调用来将数组返回到Lua。注意,根本没有boundschecking;如果试图在数组边界之外建立索引,则会崩溃。为了使其更加健壮,您需要将userdata更改为具有数组指针和数组大小的结构,以便执行BoundsCheck
#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])
由于lua是一种可嵌入语言,可以很好地与C接口,因此我希望lua文档能够提供大量的示例。你已经浏览过这些信息了吗?谢谢你的快速回答。我看过几乎所有的文档,但我找不到指向数组的指针示例。它是Lua,不是Lua。它不是首字母缩略词;这是一个名字。哇,我非常感谢你写了这篇有工作实例的精彩文章。这就是我要找的,再次感谢!我是这个论坛的新手,我怎么能给你打分呢?对于我这样的新手,我真的很欣赏luabind的易用性-对于你简单的问题,你可以看到,直接用lua使用luabind需要很多代码,这基本上是一条直线-你应该看看这里是一个很好的介绍-在你对事情感到更舒服之后,直接在lua中开发仍然更好-但是使用luabind你基本上可以非常快地完成很多事情以获得一个工作概念