Lua中的控制流
2013-12-12 9:20:13
收藏:0
阅读:197
评论:1
我有一个问题,我想必须非常常见,你们中的大多数人都会面对它。
我已经在 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 实现的。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- 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.这应该是自解释的。你应该仔细阅读《Lua 程序设计》第 9 章:协程(英文原版)。
最大的困难(如果你不习惯于协作线程)是协程应该自己 yield:不是调用函数负责返回控制权。
希望这能帮助到你。