Попробуйте новейшую версию LuaJIT 2.0 от Mike Pall с новым интерфейсом FFI (все еще в разработке).
Это позволяет вам напрямую манипулировать структурами и массивами Си из Lua, используя естественный синтаксис Lua. Пример, приведенный в документации LuaJIT:
local ffi = require("ffi")
ffi.cdef[[
typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
]]
local function image_ramp_green(n)
local img = ffi.new("rgba_pixel[?]", n)
local f = 255/(n-1)
for i=0,n-1 do
img[i].green = i*f
img[i].alpha = 255
end
return img
end
Если вы не можете использовать LuaJIT, используйте стандартные пользовательские данные Lua, для которых вы можете выделить любой необходимый вам размер (size * sizeof(double)
) и создать соответствующие метаметоды __index
и __newindex
для доступа к элементам, используя array[i]
.
Вы не можете использовать lightuserdata таким образом, потому что вы не можете установить их метатабельность, но вы можете использовать их следующим образом: value = get(array, i); set(array, i, value)
.