Lua中的控制流

Lua中的控制流,lua,embedded-linux,lua-5.2,Lua,Embedded Linux,Lua 5.2,我有一个问题,我想这一定是很常见的,你们中的大多数人都会面对它。 我已经用lua编写了一个程序,比如main.lua,它在接收到关键事件时应该修改坐标并显示几何图形。 这个lua代码调用reg.c,它在那里注册。 现在在reg.c中,我有一个函数引擎,它接收按下的键并将其传递给负责键处理的lua函数。 但当关键事件发生时,lua代码完成注册并退出,因此来自引擎的调用变成非法内存访问,导致分段错误 另外,我想我们不能让lua调用挂起在reg函数中,而从其他地方调用引擎函数 那么解决办法应该是什么,

我有一个问题,我想这一定是很常见的,你们中的大多数人都会面对它。 我已经用lua编写了一个程序,比如main.lua,它在接收到关键事件时应该修改坐标并显示几何图形。 这个lua代码调用reg.c,它在那里注册。 现在在reg.c中,我有一个函数引擎,它接收按下的键并将其传递给负责键处理的lua函数。 但当关键事件发生时,lua代码完成注册并退出,因此来自引擎的调用变成非法内存访问,导致分段错误

另外,我想我们不能让lua调用挂起在reg函数中,而从其他地方调用引擎函数

那么解决办法应该是什么,请引导我通过这个

@雅各布:这是我试图实现的原型:

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      
     }

}
现在,一旦进入按键处理程序,当他忙于绘制点时,除非并直到出现故障情况,我无法接收按键,直到那时

我希望这个解释简单得多,并且说明了我的观点,并将有助于其他人理解这个问题。 我真的很抱歉,但我不善于表达或让别人理解


还有一件事,我已经按照C语法进行了解释,但是这完全是在lua中实现的

您的代码片段仍然基本上没有信息,理想情况下,您应该能够在一个常用的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.
这应该是不言自明的。你可能应该好好看看

如果您不习惯于协作线程,那么最大的困难是协作线程应该自行产生:负责返回控制的不是调用函数


希望这对您有所帮助。

很难从您的问题中看到您的设置和您试图实现的目标。例如,没有人知道reg.c做什么或应该做什么,发动机也是如此。请详细说明,并提供一个最小的代码示例来演示什么不起作用。@jpjacobs:我已经尽了最大努力更新了这个问题,请您看看是否可以为我推荐一些解决方案。我曾尝试使用协程,但没有成功help@jpjacobs我已尽最大努力更新了问题,请看看你是否能为我推荐一些解决这个问题的方法