Lua中的控制流程

时间:2012-06-25 15:06:48

标签: lua embedded-linux lua-5.2

我有一个问题,我认为必须非常普遍,大多数人都会遇到它。 我在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

中实现

1 个答案:

答案 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>

希望这会对你有所帮助。