lua脚本语法循环问题 求助啊

Lua循环 - Lua教程
可能有一种情况,当需要执行代码块多次。在一般情况下,语句顺序执行:在一个函数的第一条语句,首先执行,然后是第二个,等等。
编程语言提供了各种控制结构,使它能够更复杂的执行路径。
循环语句允许我们执行语句或语句组多次,然后下面是在大多数的编程语言循环语句的一般形式为:
LUA程序设计语言提供了下列循环的类型来处理循环的要求。点击以下链接,查看其详细信息。
重复的声明语句或组,当给定的条件为真。它测试在条件执行循环体之前。
多次执行语句的顺序和缩写,它管理的循环变量的代码。
重复此组语句的操作,直到满足条件。
可以使用一个或多个内嵌的任何其他while, for 或do..while循环。
循环控制语句:
循环控制语句更改执行其正常顺序。当执行留下了范围,在该范围内创建的所有对象自动销毁。
Lua支持下控制语句。点击以下链接,查看其详细信息。
终止循环和转换执行即时的循环或开关下面的语句。
无限循环:
一个循环变为无限循环,如果条件永远为false。 while循环通常被用于此目的。由于我们直接给出正确的条件下,它一直执行,直到永远。我们可以用break语句来打断(退出)这种循环。
while( true )
print(&This loop will run forever.&)Lua嵌套循环 - Lua教程
Lua嵌套循环
Lua嵌套循环
Lua编程语言允许使用一个循环内嵌另一个循环。下文将介绍几个例子来说明这一概念。
在Lua中嵌套循环语法语句如下:
for init,max/min value, increment
for init,max/min value, increment
statement(s)
statement(s)
在Lua编程语言中的嵌套的while循环的语法语句,如下所示:
while(condition)
while(condition)
statement(s)
statement(s)
Lua编程语言嵌套repeat...until循环的语法语句如下:
statement(s)
statement(s)
until( condition )
until( condition )
在循环嵌套最后需要说明的是,可以把任何类型的循环放入到任何其他类型的循环里面。例如,一个for循环可以在另外一个while循环内,反之亦然。
下面的程序使用一个嵌套的循环:
for i=2,10 do
for j=2,(i/j) , 2 do
if(not(i%j))
if(j & (i/j))then
print(&Value of i is&,i)
当建立和运行上面的代码,它会产生以下结果。
Value of i is 8
Value of i is 9
Value of i is 10Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)(Lua,魔兽脚本
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)(
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口您所在的位置: &
检测Lua脚本中死循环及解决方法
检测Lua脚本中死循环及解决方法
检测Lua脚本中死循环及解决方法是本文要介绍的内容,一般LUA在测试的时候,往往会因为什么原因导致死循环,那么本文将会解决这个问题,来看内容。
检测Lua脚本中死循环及解决方法是本文要介绍的内容,一般LUA在测试的时候,往往会因为什么原因导致死循环,那么本文将会解决这个问题,来看内容。
Lua是一门小巧精致的语言,特别适用于嵌入其它的程序为它们提供脚本支持。不过脚本通常是用户编写的,很有可能出现死循环,虽说这是用户的问题,但却会造成我们的宿主程序死掉。所以检测用户脚本中的死循环并中止这段脚本的运行就显得非常重要了。
可是,一个现实的问题是死循环并不好检测,一些隐藏较深的死循环连人都很难找出来,更不用说让机器去找了。所以实际采用的方案多是检测脚本的执行时间,如果超过一定的限度,就认为里面有死循环,我下面的例子也是用的这种方法。
以下是几个相关的全局变量(我是喜欢把C++当C用的程序员,C++的忠实粉丝请忍耐一下:))的定义。
lua_State*&g_lua&=&NULL;&&&&&&&&&&&&//&lua脚本引擎& &volatile&unsigned&g_begin&=&0;&&&&&&//&脚本开始执行的时间& &volatile&long&g_counter&=&0;&&&&&&&&//&脚本执行计数,&用于判断执行超时& &volatile&long&g_check&=&0;&&&&&&&&&&//&进行超时检查时的执行计数&&&
run_user_script用来执行用户脚本,它首先通过GetTickCount把当前的时间记录到g_begin中去。然后将g_counter加一,在执行完用户脚本后再将其加一,这样就可以保证执行用户脚本时它是个奇数,而不执行时是偶数,检测脚本超时的代码可以籍此来判断当前是否在执行用户脚本。还要注意调用用户脚本要使用lua_pcall而不是lua_call,因为我们中止脚本的执行会产生一个Lua中的&错误&,在C/C++中它是一个异常,只有用lua_pcall才能保证这个错误被Lua脚本引擎正确处理。
int&run_user_script(&int&nargs,&int&nresults,&int&errfunc&)& &&&&g_begin&=&GetTickCount();& &&&_InterlockedIncrement(&&g_counter&);& &&&int&err&=&lua_pcall(&g_lua,&nargs,&nresults,&errfunc&);& &&&_InterlockedIncrement(&&g_counter&);& &&&return&& &&&
下面的check_script_timeout用来检测脚本超时,需要在另外一个线程中周期性的调用,原因我想就不用解释了吧。它首先检查是否在执行用户脚本,或者是否已经让当前执行的用户脚本中止过。然后看这段脚本执行了多长时间,超过限度就把当前脚本计数记录到g_check中去,并通过lua_sethook设置一个钩子函数timeout_break,这个钩子函数会在用户脚本执行时被调用。
&&void&check_script_timeout()& &{& &&&&&long&counter&=&g_counter;& &&&& &&&&&//&没有执行用户脚本,&不检查超时& &&&&&if(&(counter&&&0x)&==&0&)& &&&&&&&&&& &&&& &&&&&//&已经让当前执行的用户脚本中止了& &&&&&if(&g_check&==&counter&)& &&&&&&&&&& &&&& &&&&&//&如果执行时间超过了设置的超时时间(这里是1秒),&终止它& &&&&&if(&GetTickCount()&-&g_begin&&1000&)& &&&&&{& &&&&&&&&&g_check&=&counter;& &&&&&&&&&int&mask&=&LUA_MASKCALL&|&LUA_MASKRET&|&LUA_MASKLINE&|&LUA_MASKCOUNT;& &&&&&&&&&lua_sethook(&g_lua,&timeout_break,&mask,&1);& &&&&&}& &}&&&
最后就是那个钩子函数了,它首先把钩子去掉,因为这个钩子只要执行一次就行了。由于设置钩子和执行钩子是在不同的线程中,并且钩子从设置到执行需要一定的时间,所以它要通过对比g_check和g_counter来判断是否还在运行判断超时所执行的那段脚本,不是就什么也不做,是就通过luaL_error产生一个错误,并中止脚本的执行,而这个错误最终会被run_user_script中的lua_pcall捕获。
&&void&timeout_break(&lua_State*&L,&lua_Debug*&ar&)& &{& &&&&&lua_sethook(&L,&NULL,&0,&0&);& &&&&&//&钩子从设置到执行,&需要一段时间,&所以要检测是否仍在执行那个超时的脚本& &&&&&if(&g_check&==&g_counter&)& &&&&&&&&&luaL_error(&L,&&script&timeout.&&);& &}&&&
上面的检测使用了两个线程,其实在一个线程中也可以做到,并且更简单。但那样会导致钩子函数频繁执行,影响效率,如果对性能没什么要求的话,也可以采用。
小结:检测Lua脚本中死循环及解决方法的内容介绍完了,希望通过本文的学习能对你有所帮助!【编辑推荐】【责任编辑: TEL:(010)】
关于&&的更多文章
Lua是一个被设计成用于扩展C/C++编程的轻量级脚本语言,它的目标
既然强大的Android Studio来了,有什么理由不去用呢?
谷歌在新品发布会上正式发布了传闻已久的Android 4.3
App定价是开发者不可忽视的部分,它是确保应用高能见
微信自引入语音短信功能用户量爆发之后,发展状况一直
信息安全风险评估理论研究日趋成熟,相关资料比较充分,但有关评估实际工作的参考资料很少。本书以信息安全风险评估实践为基础,
Windows Phone专家
Android开发专家
51CTO旗下网站lua for循环代码示例 - 下载频道 - CSDN.NET
&&&&lua for循环代码示例
&lua for循环代码示例
lua for循环代码示例,比较简单,仅供参考测试
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 传优质资源可以获取积分,详细见。选择完成有奖的任务,可以获取积分。选择购买VIP会员服务,无需积分下载资源。评价资源返积分:第一次绑定手机,将获50下载积分及100论坛可用分。论坛可用分兑换下载积分。
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
lua for循环代码示例
所需积分:0
剩余积分:
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000

我要回帖

更多关于 lua脚本编辑器 的文章

 

随机推荐