У меня есть эта структура 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
?
return num
. Главное, после выполненияffi.cast
,b
теперь является «cdata», а ffi не предоставляет возможности обратного преобразования в пользовательские данные. lua-api не понимает cdata. - person greatwolf   schedule 10.02.2015b
иnum
оба относятся к одному и тому же объекту. Изменение полей черезb
будет отражено вnum
. Например, выполнениеprint(b, num)
покажет тот же адрес, но один будет рассматриваться как «cdata», а другой — как «userdata». - person greatwolf   schedule 10.02.2015num
, чтобы изменить его, это просто указатель - person MrFabio   schedule 10.02.2015num
, вы делаете это черезb
.b = ffi.cast("point_t *", num)
похож наlua_touserdata
, но из пространства lua стало возможным благодаря ffi luajit. Изменение полей с помощьюb
автоматически изменит его и вnum
, так как они указывают на один и тот же базовый объект. Я не уверен, где путаница. - person greatwolf   schedule 10.02.2015