数组共享c语言,在lua和C之间共享数组

您可以通过userdata将任意数据暴露给Lua.如果为userdata值提供metatable,则可以为这些userdata上的各种运算符/操作定义行为.在这种情况下,我们希望将一个数组暴露给Lua,并定义在array [index]和array [index] = value的情况下要做什么.

我们通过创建一个足够大的userdata缓冲区来保存数组的地址,从而将数组暴露给Lua.我们通过使用__index和__newindex方法创建metatable来定义索引/赋值行为.

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

#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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值