Как получить несколько возвращаемых значений из функции в Lua C API? - PullRequest
4 голосов
/ 27 июня 2019

Я хотел бы знать, как получить несколько возвращаемых значений из функции в Lua C API.

Код Lua:

function test(a, b)
  return a, b -- I would like to get these values in C++
end

Код C ++: (часть, где вызывается функция)

/* push functions and arguments */
lua_getglobal(L, "test");  /* function to be called */
lua_pushnumber(L, 3);   /* push 1st argument */
lua_pushnumber(L, 4);   /* push 2nd argument */

/* call the function in Lua (2 arguments, 2 return) */
if (lua_pcall(L, 2, 2, 0) != 0)
{
    printf(L, "error: %s\n", lua_tostring(L, -1));
    return;
}
int ret1 = lua_tonumber(L, -1);
int ret2 = lua_tonumber(L, -1);
printf(L, "returned: %d %d\n", ret1, ret2);

Результат, который я получаю:

возвращено: 4 4

Результат, который я ожидаю:

возвращено: 3 4

Ответы [ 2 ]

5 голосов
/ 27 июня 2019

lua_tonumber не изменяет стек lua_State.Вам нужно прочитать его по двум разным индексам 1 :

int ret1 = lua_tonumber(L, -2);
int ret2 = lua_tonumber(L, -1);
printf(L, "returned: %d %d\n", ret1, ret2);

Перед тем, как вызвать test, ваш стек выглядит так:

lua_getglobal(L, "test");  /* function to be called */
lua_pushnumber(L, 3);   /* push 1st argument */
lua_pushnumber(L, 4);   /* push 2nd argument */

|     4     |  <--- 2
+-----------+
|     3     |  <--- 1
+-----------+
|    test   |  <--- 0
+===========+

Послевызов 2 :

lua_pcall(L, 2, 2, 0) 

+-----------+
|     3     |  <--- -1
+-----------+
|     4     |  <--- -2
+===========+

Альтернативой может быть ручное извлечение результатов после прочтения:

int ret1 = lua_tonumber(L, -1);
lua_pop(L, 1);
int ret2 = lua_tonumber(L, -1);
lua_pop(L, 1);
printf(L, "returned: %d %d\n", ret1, ret2);

1)" Если функция возвращает несколько результатов, первый результат помещается первым, поэтому при наличии результатов n первый будет с индексом -n, а последний с индексом -1 «. Программирование на Lua: 25,2

2)" Перед отправкой результатов lua_pcall удаляет из стека функцию и ее аргументы ." Программирование на Lua: 25,2

4 голосов
/ 27 июня 2019

Вы берете один и тот же индекс дважды:

int ret1 = lua_tonumber(L, -1);
int ret2 = lua_tonumber(L, -1);

Стек заполняется так:

-- Lua
return a, b

+---+
| b | <-- top ("relative" index -1)
+---+
| a | <-- -2
+---+

Таким образом, ваш код C ++ должен быть:

// don't know what ret1 or ret2 suppose to be.
// 1 = first on stack, or first return value?
// renamed to a and b for better understanding
int retb = lua_tonumber(L, -1);
int reta = lua_tonumber(L, -2);
// lua_pop(L, 2); // don't forget to pop the values

From 24.2.3 - Другие операции со стеком :

[...] Функция lua_gettop возвращает количество элементов в стеке, которое также является индексом вершиныэлемент. Обратите внимание, что отрицательный индекс -x эквивалентен положительному индексу gettop - x + 1. [...]

Это позиционирование с отрицательным индексом допустимо для всех функций Lua, касающихсядоступ к стеку, включая lua_tonumber.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...