2

在 Lua 代码中

Test = {}
function Test:new()
  local obj = {}
  setmetatable(obj, self)
  self.__index = self
  return obj
end
local a = Test:new()
a.ID = "abc123"
callCfunc(a)

在 C 代码中

int callCfunc(lua_State * l)
{
   void* obj = lua_topointer(l, 1);            //I hope get lua's a variable
   lua_pushlightuserdata(l, obj);   
   lua_getfield(l, 1, "ID");
   std::string id = lua_tostring(l, 1);        //I hoe get the value "abc123"
   ...
   return 0;
}

但我的 C 结果是

id = null

为什么?如何修改代码以正常工作?
PS:我不希望创建 C 测试类映射到 lua

==== update1 ====
另外,我添加了测试代码来确认传入的参数是否正确。

int callCfunc(lua_State * l)
{
   std::string typeName = lua_typename(l, lua_type(l, 1));    // the typeName=="table"
   void* obj = lua_topointer(l, 1);            //I hope get lua's a variable
   lua_pushlightuserdata(l, obj);   
   lua_getfield(l, 1, "ID");
   std::string id = lua_tostring(l, 1);        //I hoe get the value "abc123"
   ...
   return 0;
}

结果

typeName == "table" 

所以传入的参数类型是正确的

4

2 回答 2

3

我发现
正确的 c 代码应该是......
在 C 代码中

int callCfunc(lua_State * l)
{
   lua_getfield(l, 1, "ID");
   std::string id = lua_tostring(l, -1);        //-1
   ...
   return 0;
}
于 2013-01-08T08:21:45.430 回答
0

也许这 - 没有测试抱歉 - 手边没有编译器

输入是来自堆栈顶部的 lua 表,因此 getfield(l,1, "ID") 应该从堆栈顶部的表中获取字段 ID - 在本例中是您的输入表。然后将结果压入栈顶

int callCfunc(lua_State * l)
{
   lua_getfield(l, 1, "ID");
   std::string id = lua_tostring(l, 1);        //I hoe get the value "abc123"
   ...
   return 0;
}
于 2013-01-08T07:07:24.843 回答