Lua - C++ интеграция: Извикване на функция в таблица от C++

Не съм експерт по Lua, но прочетох няколко статии, за да разбера как работи. Въпреки това имам проблем с извикването на lua функции, които принадлежат към таблица от C++.

В примера, описан по-долу, се опитвам да извикам foo:bar от код. Обаждането е успешно. Параметърът "a" обаче е нула (връщаната стойност е правилна - когато променя върнатата стойност на например 10, тогава тя показва правилен резултат)

Пропуснах ли нещо по време на натискане на аргументите на функцията към скрипта?

lua_State* state = LuaIntegration->GetLuaState();
lua_getglobal(state, "foo");
if(lua_istable(state,  lua_gettop(state))) { 
    lua_getfield(state, -1, "bar");
    if(lua_isfunction(state, lua_gettop(state))) { 
        lua_pushinteger(state, 0);
        if (lua_pcall(state, 1, 1, 0) != 0) {
            ErrorMessage = lua_tostring(state, -1);
        }
        ReturnValue = lua_tointeger(state, -1);
    }
}

Той извиква функция в lua:

foo = base_foo:new()

function foo:new(o)
      o = o or {}
      setmetatable(o, self)
      self.__index = self
      return o
end

function foo:bar(a) 
  if a==10 then
    return a
  end
  return 0
end

person Norbert Ozdoba    schedule 04.08.2016    source източник


Отговори (1)


Забравихте захарта във вашето C++ обаждане.

Ако прочетете раздела Извиквания на функции на lua ръководство ще видите това

Извикване v:name(args) е синтактична захар за v.name(v,args), с изключение на това, че v се оценява само веднъж.

Което означава, че base_foo:new() всъщност е само base_foo.new(base_foo).

Това е, което ви липсва във вашия C++ разговор.

Трябва да предадете таблицата като първи аргумент на функцията, когато я извиквате.

person Etan Reisner    schedule 04.08.2016
comment
Ааа има смисъл. Благодаря ти - person Norbert Ozdoba; 04.08.2016