0

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

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

那么应该是什么解决方案,请指导我完成这个。


@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 中实现的

4

1 回答 1

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.

这应该是不言自明的。您可能应该好好看看《Lua 编程》第 9 章:协程

最大的困难(好吧,如果你不习惯协作线程)是协程应该让自己产生:它不是负责返回控制的调用函数。

希望这对您有所帮助。

于 2012-07-04T08:00:32.930 回答