Lua: эффективно работать (чтение / запись) в C-стиле, C-распределенные динамические массивы в lua - PullRequest
3 голосов
/ 02 февраля 2011

Предположим, что в коде C / C ++ я выделил динамический массив пар типа C, поэтому у меня есть:

double *x; //Pointing to beginning of allocated memory
int size; //Size of array

Можно ли написать код lua (или даже код C / C ++использовать в lua), чтобы внедренный в C / C ++ экземпляр lua мог эффективно считывать / записывать элементы этого «представления» в массиве?

Мне просто необходима поддержка следующих операций C ++:

double y = x[2]; //Reading
x[2] = 3.0; //Writing
int vecSize = x.size(); //Size of array

Управление памятью не требуется (и не требуется).

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

Конечно, экспортируйте указатель как userdata и установите метаметоды __index и __newindex.

3 голосов
/ 02 февраля 2011

Попробуйте новейшую версию 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...