Давайте рассмотрим следующую функцию C:
void returnMultipleValuesByPointer(int* ret0, int* ret1, int* ret2)
{
*ret0 = 0;
*ret1 = 1;
*ret2 = 2;
}
Как мне выставить его в Lua с помощью LuaBridge? Вся документация и примеры иллюстрируют сложные случаи, когда указанные объекты являются классами, но я не могу найти, как справиться с таким простым случаем …
Тривиальный подход (т.е. luabridge::getGlobalNamespace(L).addFunction("test", &returnMultipleValuesByPointer))
компилирует, но не понимает, значения должны быть переданы по адресу.
Вы не можете сделать это напрямую. Вы должны написать метод-оболочку, который преобразует параметры в возвращаемые значения. Это требует написания такого метода. Например, если это чистый возвращаемые значения (т.е. они не принимают параметров):
int lua_ReturnMultipleValuesByPointer(lua_State *L)
{
int ret0;
int ret1;
int ret2;
returnMultipleValuesByPointer(&ret0, &ret1, &ret2);
lua_pushinteger(L, ret0);
lua_pushinteger(L, ret1);
lua_pushinteger(L, ret2);
return 3;
}
Вам нужно будет зарегистрировать это с помощью «addCFunction», так как это стандартная функция Lua.
Если то, что вы хотите сделать, это что-то вроде:
a=0
b=0
c=0
test(a,b,c)
-- NOW a is 0, b is 1, c is 2
Я не думаю, что это возможно. Вы должны вернуться к вызову Луа, как это:
a,b,c=test()
Теперь тест можно объявить так:
luabridge::getGlobalNamespace(L).addCFunction("test", &returnMultipleValues)
int returnMultipleValues (lua_State* L) {
push(L,0);
push(L,1);
push(L,2);
return 3;
}