Доступ к пользовательским данным Light в Lua - PullRequest
2 голосов
/ 10 июня 2011

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

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

был объявлен как 'test' и определен как что-то вроде x = 413 и y = 612, и отправлено с вызовом

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

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

Ответы [ 2 ]

11 голосов
/ 10 июня 2011

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

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

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

1 голос
/ 10 июня 2011

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

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

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