Использование LuaBridge с указателями на встроенные типы

Давайте рассмотрим следующую функцию C:

void returnMultipleValuesByPointer(int* ret0, int* ret1, int* ret2)
{
*ret0 = 0;
*ret1 = 1;
*ret2 = 2;
}

Как мне выставить его в Lua с помощью LuaBridge? Вся документация и примеры иллюстрируют сложные случаи, когда указанные объекты являются классами, но я не могу найти, как справиться с таким простым случаем …

Тривиальный подход (т.е. luabridge::getGlobalNamespace(L).addFunction("test", &returnMultipleValuesByPointer)) компилирует, но не понимает, значения должны быть переданы по адресу.

0

Решение

Вы не можете сделать это напрямую. Вы должны написать метод-оболочку, который преобразует параметры в возвращаемые значения. Это требует написания такого метода. Например, если это чистый возвращаемые значения (т.е. они не принимают параметров):

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.

2

Другие решения

Если то, что вы хотите сделать, это что-то вроде:

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;
}
0

По вопросам рекламы [email protected]