找回密码
 加入
搜索
查看: 13387|回复: 15

[AU3基础] 错误提示:数组变量目标或下标尺寸范围不超过数。(已解决)

  [复制链接]
发表于 2014-3-6 08:49:45 | 显示全部楼层 |阅读模式
本帖最后由 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[2],$sssliangdian[3])

循环查找这张图片,直到这张图片存在,然后点击这张图片所在的位置
个人认为,在当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之后才执行下面的代码,为什么还会报错呢?求指导
发表于 2014-3-6 10:12:22 | 显示全部楼层
BinaryLen($liangdian)>0 就一定可以分割出 $sssliangdian[3] ?这可不一定。
不需要Do,判断数组大小即可。
If UBound($sssliangdian) >= 3 Then MouseClick("left",$sssliangdian[2],$sssliangdian[3])
 楼主| 发表于 2014-3-6 10:42:23 | 显示全部楼层
回复 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]=0    $liangdian[1]=0,x,y
            $ssliangdian=StringSplit($liangdian,"|")
                      ;  $ssliangdian[0]=2      $ssliangdian[1]=0      $ssliangdian[2]=0,x,y
            $sssliangdian=StringSplit($ssliangdian[2],",")
                      ;$sssliangdian[0]=3          $sssliangdian[1]=1           $sssliangdian[2]=x           $sssliangdian[3]=y
            MouseClick("left",$sssliangdian[2],$sssliangdian[3])
                      ;鼠标点击坐标x,y



我的理解错了吗?我的理解是, BinaryLen($liangdian)>0就肯定找到了这图片,找到了一定会有$sssliangdian[2],$sssliangdian[3]的啊
 楼主| 发表于 2014-3-6 10:47:46 | 显示全部楼层
回复 2# afan

比如找到4个图片,我觉得找到了一定会有$sssliangdian[2],$sssliangdian[3]的
    $liangdian=4|0,1382,230|0,1382,360|0,1382,547|0,1382,710
$ssliangdian[0]=4
$ssliangdian[1]=0,1382,230 所对应的 $sssliangdian[2]= 1382 $sssliangdian[3]=230
$ssliangdian[2]=0,1382,360 所对应的 $sssliangdian[2]= 1382 $sssliangdian[3]=360
$ssliangdian[3]=0,1382,547 所对应的 $sssliangdian[2]= 1382 $sssliangdian[3]=547
$ssliangdian[4]=0,1382,710 所对应的 $sssliangdian[2]= 1382 $sssliangdian[3]=710
 楼主| 发表于 2014-3-6 11:12:20 | 显示全部楼层
回复 2# afan


    还有,这是一定点击程序的脚本,do之前有点击操作,等待点击操作后出来我需要的界面,才能进行下一步点击,所以我觉得do的存在是有必要的
发表于 2014-3-6 11:34:45 | 显示全部楼层
回复  afan




Do
            $liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image ...
dearmb 发表于 2014-3-6 10:42


一楼是“$sssliangdian=StringSplit($ssliangdian[$i],",")"
和你3#描述不一致,$i 打从哪边来?
无完整测试代码,讨论无意义。
 楼主| 发表于 2014-3-6 11:46:59 | 显示全部楼层
回复 6# afan

WinActivate  ("BlueStacks");激活窗口

$size = WinGetPos("BlueStacks")
$x1=$size[0]
$y1=$size[1]
$x2=$size[0]+$size[2]
$y2=$size[1]+$size[3];获取窗口范围

$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[0];获取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[2]+10,$sssliangdian[3]+10)
                                                sleep(500)

next

endif
 楼主| 发表于 2014-3-6 11:48:57 | 显示全部楼层
本帖最后由 dearmb 于 2014-3-6 12:08 编辑

回复 6# afan


    我刚回复的代码差不多能解释 意思了,就是有可能找到好几个liangdian.bmp图片,我要从最后一个点击起,来执行这个循环,所以$i表示当前该点击第几个liangdian.bmp图片
我也想贴出完整测试代码求帮忙,但是实际还得需要搭建BlueStacks测试环境啊

其余的代码就是找位置点位置,也不是每次都出现那个报错,但是能执行到报错那,肯定就是do……until走过去了啊,走过去了就说明BinaryLen ($liangdian)>0,然后$sssliangdian=StringSplit($ssliangdian[$i],",")就应该有东西啊,所以然后$sssliangdian[2],$sssliangdian[3]也应该有东西啊,所以……我就迷茫了……求助啊……5555555555
 楼主| 发表于 2014-3-6 12:09:05 | 显示全部楼层
本帖最后由 dearmb 于 2014-3-10 06:55 编辑

爱爱爱爱爱爱爱爱爱啊啊啊啊
 楼主| 发表于 2014-3-6 16:28:42 | 显示全部楼层
我把出问题的do……until……删了,好像可能大概不一定有可能是没事了,在测试
 楼主| 发表于 2014-3-7 09:48:08 | 显示全部楼层
本帖最后由 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[2]+10,$sssliangdian1[3]+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了

可是还是报错了,明明是一个数组啊
发表于 2014-3-7 11:16:17 | 显示全部楼层
贴代码应该使用标签。
测试代码需要精简并完整可执行,能重现问题,不是全部。
 楼主| 发表于 2014-3-7 11:25:02 | 显示全部楼层
本帖最后由 dearmb 于 2014-3-7 11:26 编辑

“测试代码需要精简并完整可执行,能重现问题,不是全部。”

改成代码了

精简?又要完整?
完整才能可执行吧?
没环境别人也不能重现问题啊!
发表于 2014-3-7 11:43:11 | 显示全部楼层
完整是指可执行测试,一句Msgbox(0,0,0)也是完整代码。
精简是指去掉与问题无关的,节省别人看帖时间。
没环境不能重现问题当然说明测试代码不够健壮。
看看帮助文档的实例,很多都是只描述主题的,没注意吗。
发表于 2014-3-7 12:02:15 | 显示全部楼层
不看了,自己研究吧
                                                ;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[0] >= $countliangdian Then
                                                        $sssliangdian1 = StringSplit($ssliangdian1[$i], ",")
                                                        If $sssliangdian1[0] = 3 Then MouseClick("left", $sssliangdian1[2] + 10, $sssliangdian1[3] + 10)
                                                Endif
                                                Sleep(500)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-24 02:56 , Processed in 0.079599 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表