Lua中的控制流

我有一个问题,我想必须非常常见,你们中的大多数人都会面对它。

我已经在 lua 中编写了一个程序,比如说 main.lua,它在接收到键盘事件后应该修改坐标并显示几何图形。

这个 lua 代码调用 reg.c,在那里它有点像注册。

现在在 reg.c 中我有一个函数 engine,它接收按下的键并将其传递给负责键处理的 lua 函数。

但是等到按键事件发生时,lua 代码已经完成了注册并退出,因此 engine() 的调用成为非法内存访问,导致分段错误。

另外,我认为我们不能让 lua 在 reg 函数中挂起,然后从其他地方调用 engine 函数。

那么应该采取什么解决方案,请指导我。


@jacob:这就是我试图实现的原型:

function key_handler() //这个函数会从其他函数获得最新按下的键
{
     draw.image();
     draw.geometry();
     ...
     ...

     while(1)
     {
         //在某些条件出现之前一直绘制点
     }

}

现在,一旦进入 key_handler,在它忙于绘制点直到出现失败条件之前,我无法接收到按键事件。

我希望这个解释更简单明了,并且说明了我的观点,这将有助于其他人了解问题。

我很抱歉,但我不擅长表达或让别人理解。

另外,我按照 C 语法来解释,但这完全是用 lua 实现的。

点赞
用户513763
用户513763

你的代码片段仍然大部分都没有信息(理想情况下,应该能够在一个基本的 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.

这应该是自解释的。你应该仔细阅读《Lua 程序设计》第 9 章:协程(英文原版)。

最大的困难(如果你不习惯于协作线程)是协程应该自己 yield:不是调用函数负责返回控制权。

希望这能帮助到你。

2012-07-04 08:00:32