我有一个问题,我认为必须非常普遍,大多数人都会遇到它。 我在lua中编写了一个程序,比如main.lua,它在接收键事件时应该修改坐标并显示几何图形。 这个lua代码调用reg.c,它在那里注册。 现在在reg.c中我有一个函数引擎,它接收按下的键并将其传递给负责键处理的lua函数。 但是当关键事件到来时,lua代码完成注册并退出,因此来自engine()的调用变为非法内存访问,导致分段错误。
另外我想我们不能在reg函数中挂lua调用,并从其他地方调用引擎函数。
然后应该是什么解决方案,请指导我完成这个。
@jacob:这是我想要实现的原型:
function key_handler() //this function will get the latest key pressed from some other function
{
draw.image();
draw.geometry();
...
...
while(1)
{
//draw Points until some condition goes wrong
}
}
现在,一旦进入key_handler,他正在忙着绘制积分,除非直到失败的情况发生,否则直到那时我才能收到按键。
我希望这个解释更简单,并且已经阐明了我的观点,并且会帮助其他人理解这个问题。 我很抱歉,但我不擅长表达或让别人理解。
还有一件事,我按照C语法解释,但这完全在lua
中实现答案 0 :(得分:0)
您的代码段在很大程度上仍然没有提供信息(理想情况下,您应该只能在Lua解释器中运行您的代码并查看您的问题)。如果您正在描述Lua问题,请使用Lua代码来描述它。
然而,我开始看到你想去的地方。
你需要做的就是在你的密钥处理程序中调用一个协程,它将一个参数传递给你的处理程序:
function isContinue() --just to simulate whatever function you use getting keypresses.
-- in whatever framework you're using there will probably be a function key_pressed or the like.
print('Initialize checking function')
while true do
print('Continue looping?')
local ans = io.read():match('[yY]')
local action
if not ans then
print('Do what instead?')
action = io.read()
if action:match('kill') then -- abort keychecker.
break
end
end
coroutine.yield(ans,action)
end
print('finalizing isContinue')
return nil,'STOP' -- important to tell key_handler to quit too, else it'll be calling a dead coroutine.
end
function key_handler()
local coro = coroutine.create(isContinue)
local stat,cont,action
while true do
print'Draw point'
stat,cont,action = coroutine.resume(coro)
if not stat then
print('Coroutine errored:',cont)
elseif not cont then
print('isContinue interrupted keyhandler')
print("We'll "..action.." instead.")
break
end
end
print('finalizing key_handler')
end
key_handler()
-- type something containing y or Y to continue, all else aborts.
-- when aborting, you get asked what to do instead of continuing,
--- with "kill" being a special case.
这应该是自我解释的。你应该好好看看Programming in Lua, chapter 9: Coroutines。
最大的困难(好吧,如果你不习惯协作线程)是一个协程应该产生自己:它不是负责返回控制的调用函数。 / p>
希望这会对你有所帮助。