Доступ к пользовательским данным Light в Lua

Возможно, я неправильно понимаю их использование или неправильно истолковываю документацию, но как мне получить доступ к членам структуры или класса, переданным в Lua, в качестве легких пользовательских данных? Например, если вектор использует следующую структуру

typedef struct Foo {
  int x;
  int y;
} Foo;

был объявлен как "тест" и определен как что-то вроде х = 413 и у = 612, и толкнул с вызовом

lua_pushlightuserdata( L, (void *) &test ) ;

Как будет выглядеть Lua-код функции, которая манипулирует или печатает x и y?

2 ответа

Решение

Light userdata в Lua это просто указатель. Lua не понимает, как читать содержимое объекта, на который ссылается указатель. Цель этих данных - разрешить одному вызову C API передавать ссылку на другой вызов API.

Если вы хотите работать с данными в Lua, вам нужно поместить их в стек, и в вашем случае я бы сделал их таблицей. Если вам нужно синхронизировать эти данные между C и Lua, вам нужно написать функции с обеих сторон для обработки назначения и копирования значения в другую среду. Другой вариант - иметь данные только в Lua и извлекать их через API Lua, когда они находятся в C, или иметь их в C и получать их через API C (который вы бы создали) в Lua.

Для получения дополнительной информации, программирование на Lua и Lua-пользователи Wiki имеют краткое описание.

Ничего такого. Вы не можете получить доступ или сделать что-либо с userdata любого рода из Lua. Вы должны предоставить функции C++ для всех манипуляций. Конечно, это может быть облегчено путем правильного использования метафункций.

О, и тебе это не нужно typedef struct дерьмо в C++. Вы можете просто сказать

struct Foo {
    int x;
    int y;
};
Другие вопросы по тегам