错误提示:数组变量目标或下标尺寸范围不超过数。(已解决)
本帖最后由 dearmb 于 2014-4-5 08:52 编辑标题是错误提示的百度在线翻译,原文是:
"D:\AU3test\??????\????.au3" (133) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$sssliangdian=StringSplit($ssliangdian[$i],",")
$sssliangdian=StringSplit(^ ERROR
这段是代码的一部分
Do
$liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\liangdian.bmp',"000000",0.9,2)
Until BinaryLen($liangdian)>0
$ssliangdian=StringSplit($liangdian,"|")
$sssliangdian=StringSplit($ssliangdian[$i],",")
MouseClick("left",$sssliangdian,$sssliangdian)
循环查找这张图片,直到这张图片存在,然后点击这张图片所在的位置
个人认为,在当BinaryLen($liangdian)=0的时候,查找这张图片的位置并赋值给$ssliangdian,$sssliangdian,是一定会出现这个错误提示的:“Array variable has incorrect number of subscripts or subscript dimension range exceeded.:”(实际测试过,如果找不到这图片还硬要赋值的话),所以我在之前加了do……until……循环,等到BinaryLen($liangdian)>0也就是这张图片找到了之后再赋值,这样做虽然报错的情况少了,但是依然在有的时候会报错,我实在是看不明白,明明是until BinaryLen($liangdian)>0之后才执行下面的代码,为什么还会报错呢?求指导 BinaryLen($liangdian)>0 就一定可以分割出 $sssliangdian ?这可不一定。
不需要Do,判断数组大小即可。
If UBound($sssliangdian) >= 3 Then MouseClick("left",$sssliangdian,$sssliangdian) 回复 2# afan
Do
$liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\liangdian.bmp',"000000",0.9,2)
Until BinaryLen($liangdian)>0
;当BinaryLen($liangdian)>0时,表示找到了这张图片,至少会找到1张吧,比如找到一张
;此时的数组$liangdian的内容应该为1|0,x,y, 表示,找到了1张图片,图片id为0,坐标为x,y
;$liangdian=0 $liangdian=0,x,y
$ssliangdian=StringSplit($liangdian,"|")
;$ssliangdian=2 $ssliangdian=0 $ssliangdian=0,x,y
$sssliangdian=StringSplit($ssliangdian,",")
;$sssliangdian=3 $sssliangdian=1 $sssliangdian=x $sssliangdian=y
MouseClick("left",$sssliangdian,$sssliangdian)
;鼠标点击坐标x,y
我的理解错了吗?我的理解是, BinaryLen($liangdian)>0就肯定找到了这图片,找到了一定会有$sssliangdian,$sssliangdian的啊 回复 2# afan
比如找到4个图片,我觉得找到了一定会有$sssliangdian,$sssliangdian的
$liangdian=4|0,1382,230|0,1382,360|0,1382,547|0,1382,710
$ssliangdian=4
$ssliangdian=0,1382,230 所对应的 $sssliangdian= 1382 $sssliangdian=230
$ssliangdian=0,1382,360 所对应的 $sssliangdian= 1382 $sssliangdian=360
$ssliangdian=0,1382,547 所对应的 $sssliangdian= 1382 $sssliangdian=547
$ssliangdian=0,1382,710 所对应的 $sssliangdian= 1382 $sssliangdian=710 回复 2# afan
还有,这是一定点击程序的脚本,do之前有点击操作,等待点击操作后出来我需要的界面,才能进行下一步点击,所以我觉得do的存在是有必要的 回复afan
Do
$liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image ...
dearmb 发表于 2014-3-6 10:42 http://www.autoitx.com/images/common/back.gif
一楼是“$sssliangdian=StringSplit($ssliangdian[$i],",")"
和你3#描述不一致,$i 打从哪边来?
无完整测试代码,讨论无意义。 回复 6# afan
WinActivate("BlueStacks");激活窗口
$size = WinGetPos("BlueStacks")
$x1=$size
$y1=$size
$x2=$size+$size
$y2=$size+$size;获取窗口范围
$liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\liangdian.bmp',"000000",0.9,2);在窗口范围内查找liangdian.bmp
If BinaryLen ($liangdian)>0 Then;如果找到liangdian.bmp则
$ssliangdian=StringSplit($liangdian,"|")
$countliangdian=$ssliangdian;获取liangdian.bmp的个数
For $i = $countliangdian to 1 Step -1;循环开始,从倒数第一个liangdian.bmp开始点起
#cs
这段还有别的点击,会把liangdian.bmp点没的
然后再有别的点击,等待liangdian.bmp这个界面的重新出现,所以下面do循环等待liangdian.bmp出现再点击
#ce
Do
$liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\liangdian.bmp',"000000",0.9,2)
Until BinaryLen($liangdian)>0
_FileWriteLog(@ScriptDir & "\log.log","!!!!!!!!!!!!!!!!!!!!!!"&BinaryLen($liangdian))
$ssliangdian=StringSplit($liangdian,"|")
$sssliangdian=StringSplit($ssliangdian[$i],",")
MouseClick("left",$sssliangdian+10,$sssliangdian+10)
sleep(500)
next
endif 本帖最后由 dearmb 于 2014-3-6 12:08 编辑
回复 6# afan
我刚回复的代码差不多能解释 意思了,就是有可能找到好几个liangdian.bmp图片,我要从最后一个点击起,来执行这个循环,所以$i表示当前该点击第几个liangdian.bmp图片
我也想贴出完整测试代码求帮忙,但是实际还得需要搭建BlueStacks测试环境啊
其余的代码就是找位置点位置,也不是每次都出现那个报错,但是能执行到报错那,肯定就是do……until走过去了啊,走过去了就说明BinaryLen ($liangdian)>0,然后$sssliangdian=StringSplit($ssliangdian[$i],",")就应该有东西啊,所以然后$sssliangdian,$sssliangdian也应该有东西啊,所以……我就迷茫了……求助啊……5555555555 本帖最后由 dearmb 于 2014-3-10 06:55 编辑
爱爱爱爱爱爱爱爱爱啊啊啊啊 我把出问题的do……until……删了,好像可能大概不一定有可能是没事了,在测试 本帖最后由 dearmb 于 2014-3-7 10:36 编辑
回复 6# afan
帮我看看吧,实在是不知道为什么,现在115行总报错,代码已经更新了
Do
$liangdian1 = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\liangdian.bmp',"000000",0.9,2)
_FileWriteLog(@ScriptDir & "\log.log","1 "&$liangdian1&" "&UBound(StringSplit($liangdian1,"|")))
Until UBound(StringSplit($liangdian1,"|")) >= 3
_FileWriteLog(@ScriptDir & "\log.log","已经大于0了")
$ssliangdian1=StringSplit($liangdian1,"|")
$sssliangdian1=StringSplit($ssliangdian1[$i],",")
MouseClick("left",$sssliangdian1+10,$sssliangdian1+10)
最后log输出的内容是
2014-03-07 10:37:24 : 1 0,1470,214|0,1470,339|0,1470,502|0,1470,643 5
2014-03-07 10:37:24 : 已经大于0了
可是还是报错了,明明是一个数组啊 贴代码应该使用标签。
测试代码需要精简并完整可执行,能重现问题,不是全部。 本帖最后由 dearmb 于 2014-3-7 11:26 编辑
“测试代码需要精简并完整可执行,能重现问题,不是全部。”
改成代码了
精简?又要完整?
完整才能可执行吧?
没环境别人也不能重现问题啊! 完整是指可执行测试,一句Msgbox(0,0,0)也是完整代码。
精简是指去掉与问题无关的,节省别人看帖时间。
没环境不能重现问题当然说明测试代码不够健壮。
看看帮助文档的实例,很多都是只描述主题的,没注意吗。 不看了,自己研究吧 ;Do
$liangdian1 = $dm.FindPicEx($x1, $y1, $x2, $y2, @ScriptDir & '\Image\liangdian.bmp', "000000", 0.9, 2)
; _FileWriteLog(@ScriptDir & "\log.log", "1 " & $liangdian1 & " " & UBound(StringSplit($liangdian1, "|")))
;Until UBound(StringSplit($liangdian1, "|")) >= 3
;_FileWriteLog(@ScriptDir & "\log.log", "已经大于0了")
$ssliangdian1 = StringSplit($liangdian1, "|")
If $ssliangdian1 >= $countliangdian Then
$sssliangdian1 = StringSplit($ssliangdian1[$i], ",")
If $sssliangdian1 = 3 Then MouseClick("left", $sssliangdian1 + 10, $sssliangdian1 + 10)
Endif
Sleep(500)
页:
[1]
2