Приведение структуры C в Lua/LuaJIT

У меня есть эта структура C:

typedef struct { double x, y; } point_t;    

и мне нужно отправить переменную point_t в Lua и изменить ее значения, а затем вернуть ее в C. Первая проблема, с которой я столкнулся, это преобразовать ее в Lua. Как это сделать?

main.c

point_t ponto;

ponto.x = 0; ponto.y = 0;

lua_getglobal(L, "jit"); //Get variavel with function
lua_pushlightuserdata(L, &ponto);
lua_pcall(L, 1, 1, 0);

point_t *pontop = (point_t*)lua_touserdata(L, -1);

test.lua

 jit = function(num)
    local ffi = require("ffi")
    ffi.cdef[[
    typedef struct { double x, y; } point_t;
    ]]

    local point
    local mt = {}
    point = ffi.metatype("point_t", mt)

    local a = point(3, 4)
    print(a.x, a.y)
    b = ffi.cast("point_t*",num)
    b.x = 10
    b.y = 20
    return b
end

Локальная переменная a создается с типом point_t, как я могу преобразовать b, чтобы использовать ее как a?


person MrFabio    schedule 09.02.2015    source источник
comment
Не смешивайте lua C API с механизмом FFI luajit. См. stackoverflow.com/a/18822678/234175.   -  person greatwolf    schedule 09.02.2015
comment
да, я придумал этот вопрос. Это вообще возможно?   -  person MrFabio    schedule 09.02.2015
comment
В приведенном выше случае вам, вероятно, сойдет с рук return num. Главное, после выполнения ffi.cast, b теперь является «cdata», а ffi не предоставляет возможности обратного преобразования в пользовательские данные. lua-api не понимает cdata.   -  person greatwolf    schedule 10.02.2015
comment
но важно изменить значения в структуре, в этом весь смысл.   -  person MrFabio    schedule 10.02.2015
comment
b и num оба относятся к одному и тому же объекту. Изменение полей через b будет отражено в num. Например, выполнение print(b, num) покажет тот же адрес, но один будет рассматриваться как «cdata», а другой — как «userdata».   -  person greatwolf    schedule 10.02.2015
comment
но lua не знает, как получить доступ к полям внутри num, чтобы изменить его, это просто указатель   -  person MrFabio    schedule 10.02.2015
comment
Но вы не получаете доступ к полям через num, вы делаете это через b. b = ffi.cast("point_t *", num) похож на lua_touserdata, но из пространства lua стало возможным благодаря ffi luajit. Изменение полей с помощью b автоматически изменит его и в num, так как они указывают на один и тот же базовый объект. Я не уверен, где путаница.   -  person greatwolf    schedule 10.02.2015