为了用C语言定义Lua可调用的方法,它必须匹配给定的签名,并使用Lua API来检索参数和返回结果。我正在编写Lua的C#包装器,我感兴趣的是能够调用任意的C#方法,而不需要它们遵循这些约定。当包装像D这样的东西时,可以使用模板系统为任何给定的方法动态创建粘合代码。我在想,这在C#中也是可能的,但通过使用动态代码生成。
C API看起来像这样,生成的代码将通过我的库的较低级别的部分来操作它,该部分P/调用Lua C库。
static int foo (lua_State *L)
{
int n = lua_gettop(L); /* number of arguments */
我的游戏引擎将一个值作为函数的参数推送到lua堆栈中,然后使用lua_pcall调用它。lua代码将运行并调用其他lua函数。最终,这段lua代码将调用一个C函数。此函数是否可以检索最初推送到堆栈上的值?
是这样的:
<engine function A>
pushes parameter value X on to stack for lua
<lua func>
<lua func>
<lua func>
<engine function B>
can I extract the values X that was pus
我正在尝试将Lua类对象推送到堆栈上。指向该对象的指针可以由多个函数返回。
换句话说:我需要推送用户数据值,同时保持对它们使用'==','~=‘等的能力,所以如果用户数据指针是相同的C++对象,那么它必须是相同的。
-- this should push the object onto the stack
local firstObject = GetClassObject();
firstObject:doSomething();
firstObject将由lua脚本存储,稍后在代码中我将需要再次执行此操作:
-- the c++ class pointer has
我需要帮助将在C++中创建的游戏对象推到我们的Lua环境中。这是一个在C++中创建以下GameObjects的示例 class Player
{
public:
Player(std::string pName, int ObjID)
{
this -> name = pName;
this -> objectId = ObjID
}
std::string name;
int objectId;
}; 现在我们的对象都是在C++中创建的,我们不希望在我们的Lua脚本中有它的构造函数。我对使用sol或Lua
我在一个C应用程序中使用Lua,我有两个表。我想创建第三个表,虽然它是空的,但它将为前两个表中的值建立索引。我用Lua写了下面这个简单的例子:
a = { one="1", two="2" }
b = { three="3", four="4" }
meta = { __index = function(t,k)
if a[k] == nil then return b[k]
else return a[k] end
end }
c = {}
setmetatable(c, meta)
print(c.one) --
我正在测试Garry的Mod Lua,一个奇怪的错误不断出现!
这个错误似乎在我使用任何Glua类时都会弹出,比如Player:kill!
这是我的错误
[ERROR] lua/test.lua:6: attempt to call method 'Kill' (a nil value)
下面是我使用的代码
function killplayer()
local ply = LocalPlayer()
ply:Kill()
end
killplayer()
请帮帮我!
我在Lua中有这个阶乘演算的脚本:
N, F = 1, 1
while F < 1e200 do
print(N .. "! is " .. F)
N = N + 1
-- Compute the factorial of the new N based on
-- the factorial of the old N:
F = F * N
end
Lua 5.3中的这段代码有什么问题?在19!之后,一切都变得很奇怪。但同样的代码在Lua5.1中工作得很好。
我有一个Lua脚本,它调用一个C函数。目前,此函数不返回任何内容。我想要更改这个函数以返回一个字符串,所以在这个函数的末尾,我将把这个字符串推到Stack中。在调用Lua脚本中,我需要返回被推送的字符串值。
C初始化和Lua注册
void cliInitLua( void )
{
void* ud = NULL;
Task task;
// Create a new Lua state
L = lua_newstate(&luaAlloc, ud);
/* load various Lua libraries */
luaL_openlibs(L
假设我有一个从C端拥有的指针,我希望以userdata的形式推入Lua堆栈。在不牺牲指定特定元表的能力的情况下,实现这一点的最佳方法是什么?
我最初的想法是使用一个轻量级的用户数据,但从我读到的来看,所有轻量级的用户数据共享一个公共的元表。这是不可取的,因为它将强制我的所有c-sided对象的通用行为。
考虑到我希望为Lua分配的对象重用元表,只需将一个不同的this指针传递给metamethods,我的第二个想法就是将一个人工this指针附加到userdata对象。
struct ud
{
struct T* ptr;
struct T data
我想知道在C++代码中与lua /O交互的最佳方式。 lua脚本: while true do
local input = io.read("*line")
if input == "hello" then
print("world")
else
print("hmmm...")
end
end C++代码: lua_State* L = luaL_newstate();
luaL_openlibs(L);
int r = luaL_dofile(L, "f
尽管进行了艰苦的搜索,但我仍然找不到一个有效的Lua示例来调用一个从C函数返回自定义数据的Lua函数。例如,我有寄存器函数"GetMyVector“,然后我从lua调用它来从C中检索信息,我得到的是一个表,但是我想要的是像C中那样的从结构访问变量的访问,例如:
local x = GetMyVector()
print(x[1]) -- i
print(x[2]) -- j
print(x[3]) -- k
-- how to access it via like this:
print(x.i)
print(x.j)
print(x.k)
用lua_pushnumber在三维数组中
我想向来自C++的Lua userdata对象添加一些静态字段。有问题的对象是向量,它们是在C++中创建的,它们的工作方式是这样的,但我在我的用户数据上尝试了lua_setfield,但我得到了一个attempt to index a Vector value错误,我真的不想使用.x(), .y(), .z(),因为必须调用一个函数,推送到堆栈,然后在lua端读取。
有没有办法在userdata上注册字段以供Lua访问?
如您所知,浮点有一个精度问题,即值1将为0.9999999。lua在C中使用==来检查两个双数字是否相等。所以问题是:
a = 5.6
b = 14 * 0.4
print(a==b) ; => false
但更糟的是:
a = 1
...
if a < 1 then print("<1") end ; => sometimes a < 1
那我怎么才能避免这种情况?我查看了lua源代码,似乎可以在luaconf.h中修改luai_numeq/luai_numle)宏,但这有必要吗?
更新
第二个例子并不是真的正确。实际上,我的问题是,我将一个值