dearmb 发表于 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,$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之后才执行下面的代码,为什么还会报错呢?求指导

afan 发表于 2014-3-6 10:12:22

BinaryLen($liangdian)>0 就一定可以分割出 $sssliangdian ?这可不一定。
不需要Do,判断数组大小即可。
If UBound($sssliangdian) >= 3 Then MouseClick("left",$sssliangdian,$sssliangdian)

dearmb 发表于 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    $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的啊

dearmb 发表于 2014-3-6 10:47:46

回复 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

dearmb 发表于 2014-3-6 11:12:20

回复 2# afan


    还有,这是一定点击程序的脚本,do之前有点击操作,等待点击操作后出来我需要的界面,才能进行下一步点击,所以我觉得do的存在是有必要的

afan 发表于 2014-3-6 11:34:45

回复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 打从哪边来?
无完整测试代码,讨论无意义。

dearmb 发表于 2014-3-6 11:46:59

回复 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 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,$sssliangdian也应该有东西啊,所以……我就迷茫了……求助啊……5555555555

dearmb 发表于 2014-3-6 12:09:05

本帖最后由 dearmb 于 2014-3-10 06:55 编辑

爱爱爱爱爱爱爱爱爱啊啊啊啊

dearmb 发表于 2014-3-6 16:28:42

我把出问题的do……until……删了,好像可能大概不一定有可能是没事了,在测试

dearmb 发表于 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+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了

可是还是报错了,明明是一个数组啊

afan 发表于 2014-3-7 11:16:17

贴代码应该使用标签。
测试代码需要精简并完整可执行,能重现问题,不是全部。

dearmb 发表于 2014-3-7 11:25:02

本帖最后由 dearmb 于 2014-3-7 11:26 编辑

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

改成代码了

精简?又要完整?
完整才能可执行吧?
没环境别人也不能重现问题啊!

afan 发表于 2014-3-7 11:43:11

完整是指可执行测试,一句Msgbox(0,0,0)也是完整代码。
精简是指去掉与问题无关的,节省别人看帖时间。
没环境不能重现问题当然说明测试代码不够健壮。
看看帮助文档的实例,很多都是只描述主题的,没注意吗。

afan 发表于 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 >= $countliangdian Then
                                                        $sssliangdian1 = StringSplit($ssliangdian1[$i], ",")
                                                        If $sssliangdian1 = 3 Then MouseClick("left", $sssliangdian1 + 10, $sssliangdian1 + 10)
                                                Endif
                                                Sleep(500)
页: [1] 2
查看完整版本: 错误提示:数组变量目标或下标尺寸范围不超过数。(已解决)