How to "call" a function from a Lua table in C ++

5

I'm trying to "call" a function from a table written in Lua . The problem is that I am not able to pass three arguments to this function.

When I pass the arguments, it is as if the Lua skips the first argument and continues from the second onwards. Down a snippet of code.

// C++
// Função responsável por chamar a função do script
int CPP_get(lua_State* ls)
{
    lua_getfield(ls, LUA_GLOBALSINDEX, "vec"); // Coloca vec na pilha
    lua_getfield(ls, -1, "func"); // coloca a função func na pilha
    lua_remove(ls, -2); // Remove vec da pilha
    dumpStack(ls); // Mostra a pilha

    lua_pushnumber(ls, 2.0f); // Primeiro argumento
    lua_pushnumber(ls, 4.0f); // Segundo argumento
    lua_pushnumber(ls, 8.0f); // Terceiro argumento

    dumpStack(ls); // Mostra a pilha
    std::cout << "\n";

    lua_pcall(ls, 3, 1, 0); // Chama a função

    return 1;
}


-- Lua
-- Table
vec = {}
vec.__index = vec

-- Função a ser chamada
function vec:func(x, y, z)
    print("vec:func:", x, y, z)
    return "return: OK"
end

-- Chamando a função
print("CPP.get:", CPP.get())


 The dumpStack function is to show the elements of the current "stack". Below is a print of how the "stack" is. At the end of the run it only goes from the second argument onwards.

    
asked by anonymous 26.08.2014 / 20:20

1 answer

5

Your function actually has 4 arguments. The code

function vec:func(x, y, z)
  print("vec:func:", x, y, z)
  return "return: OK"
end

is syntactic sugar for

vec.func = function(self, x, y, z)
  print("vec:func:", x, y, z)
  return "return: OK"
end

There are two things you can do: if your function does not need self, you can make it receive only 3 arguments:

vec.func = function(x, y, z) ... end
-- OU
function vec.func(x,y,z) ... end

Alternatively, you can make your C ++ code pass vec as the first argument of the function. In your case, you can do this by changing the vec and func positions in the stack instead of removing vec.

// C++
// Função responsável por chamar a função do script
int CPP_get(lua_State* ls)
{
    lua_getfield(ls, LUA_GLOBALSINDEX, "vec"); // Coloca vec na pilha
    lua_getfield(ls, -1, "func"); // coloca a função func na pilha

    lua_insert(L, -2);        // Troca os dois elementos no topo da pilha de posição
    lua_pushnumber(ls, 2.0f); // Primeiro argumento  (segundo, contando com o self)
    lua_pushnumber(ls, 4.0f); // Segundo argumento   (terceiro, contando com o self)
    lua_pushnumber(ls, 8.0f); // Terceiro argumento  (quarto, contando com o self)

    lua_pcall(ls, 4, 1, 0); // Chama a função  //4 argumentos!

    return 1;
}
    
26.08.2014 / 21:25