131738 发表于 2013-11-2 17:18:20

【已解决】如何操作同一名称数组, 内容完全不同的问题, 谢谢!!!

本帖最后由 131738 于 2013-11-3 14:04 编辑

For $i = 1 To 5 ; 主循环
        Switch $i
                Case 1
                        $Path = (@ScriptDir & "\Dir1\")
                Case 2
                        $Path = (@ScriptDir & "\Dir2\")       
                Case 3       
                        $Path = (@ScriptDir & "\Dir3\")       
                Case 4       
                        $Path = (@ScriptDir & "\Dir4\")
                Case 5
                        $Path = (@ScriptDir & "\Dir5\")
        EndSwitch
        _FileToArray();读文件名到数组
        _Operate();操作文件名数组
Next

Func _FileToArray()
        ...
        ...
        Return $File_Array;根据 For 循环, 返回不同内容的数组
EndFunc

Func _Operate();操作文件名数组
        ...
        ...
        ;操作完成后, 循环删除数组元素, 清空当前数组
        For $i = 0 To UBound($File_Array) - 1
                _ArrayDelete($File_Array, 0);依次删除数组 0 元素,直到最后清空数组
        Next
        DirRemove ( $Path );删除已处理的文件夹
EndFunc问题:
实际运行这个脚本, _Operate() 能顺利完成主循环 Case 1 传递的内容,
但当执行 Case 2 时, _Operate() 发生错误退出脚本, 提示数组索引错误,
测试检查,发现这时 _FileToArray() 返回的 $File_Array 前面元素为 Case 1 传递文件夹 Dir1 的内容,
后面才是 Case 2 传递文件夹 Dir2 的内容, 由于执行 Case 1 的最后已删除文件夹 Dir1,
到执行第二次 _Operate() 执行时, 没有了文件夹 Dir1 的文件, 使得 _Operate() 操作失败!

请问是否内存残留的原因, 是或不是, 应如果处理? 谢谢!!!

afan 发表于 2013-11-2 19:07:14

清空数组 给数组变量赋值为0就行了
如28-30行改为 $File_Array = 0

user3000 发表于 2013-11-2 19:35:44

回复 1# 131738

帮前辈简化一丁点代码。认为直接以 ByRef 传递原始数组,就一定不会出错了。For $i = 1 To 5 ; 主循环
        $Path = @ScriptDir & "\Dir" & $i & "\"
        _Operate(_FileToArray($Path));操作文件名数组
Next

Func _FileToArray($sPath)   ;读文件名到数组
      ;...
      ;...
      Return $File_Array;根据 For 循环, 返回不同内容的数组
EndFunc

Func _Operate(ByRef $aArray);操作文件名数组
      ;...
      ;...
      ;操作完成后, 循环删除数组元素, 清空当前数组
      $aArray = 0
      DirRemove ( $Path );删除已处理的文件夹
EndFunc

131738 发表于 2013-11-2 19:49:57

回复131738

帮前辈简化一丁点代码。认为直接以 ByRef 传递原始数组,就一定不会出错了。
user3000 发表于 2013-11-2 19:35 http://www.autoitx.com/images/common/back.gif

【 $aArray = 0 】这个试过了的, 不行....

afan 发表于 2013-11-2 19:58:52

【 $aArray = 0 】这个试过了的, 不行....
131738 发表于 2013-11-2 19:49 http://www.autoitx.com/images/common/back.gif


    那肯定是别的地方出错了,由于代码不全,不好分析。$File_Array 是否为全局变量、或者是否使用的ByRef方式赋值都不清楚。

131738 发表于 2013-11-2 20:36:03

那肯定是别的地方出错了,由于代码不全,不好分析。$File_Array 是否为全局变量、或者是否使用的 ...
afan 发表于 2013-11-2 19:58 http://www.autoitx.com/images/common/back.gif

全局变量是肯定的,倒是 ByRef 赋值数组这个不知如何定义.

131738 发表于 2013-11-2 20:39:33

回复 6# 131738

简单说,一个文件夹有 2900 多文件,分包到若干个文件夹,就为加快处理速度.

131738 发表于 2013-11-2 20:42:22

回复 7# 131738

同一个脚本,分若干次单独执行没有问题的,想一次处理所有文件夹就出问题....

afan 发表于 2013-11-2 20:49:21

回复131738

同一个脚本,分若干次单独执行没有问题的,想一次处理所有文件夹就出问题....
131738 发表于 2013-11-2 20:42 http://www.autoitx.com/images/common/back.gif


    估计是前辈的_FileToArray()有问题

131738 发表于 2013-11-2 20:58:15

估计是前辈的_FileToArray()有问题
afan 发表于 2013-11-2 20:49 http://www.autoitx.com/images/common/back.gif

我再看看...

afan 发表于 2013-11-2 23:32:29

我再看看...
131738 发表于 2013-11-2 20:58 http://www.autoitx.com/images/common/back.gif


    莫非 _FileToArray() 里面是用的 _ArrayAdd 方式?那样既慢且可能会出现一楼的错误

131738 发表于 2013-11-3 00:26:00

莫非 _FileToArray() 里面是用的 _ArrayAdd 方式?那样既慢且可能会出现一楼的错误
afan 发表于 2013-11-2 23:32 http://www.autoitx.com/images/common/back.gif

没有 _ArrayAdd
现在我该用 3.3.9.21 版的 _FileListToArray , 仍然是一样的问题.....

afan 发表于 2013-11-3 00:59:18

回复 12# 131738


    看来这样猜是难以猜到的。在一楼14行前插入一行清零试试 $File_Array = 0

131738 发表于 2013-11-3 14:03:19

回复131738


    看来这样猜是难以猜到的。在一楼14行前插入一行清零试试 $File_Array = 0
afan 发表于 2013-11-3 00:59 http://www.autoitx.com/images/common/back.gif

谢谢你凌晨时间还在思考这个问题!!!
问题找到了,原来一个计数的变量在第一次循环后没有归 0 , 导致以后的计数出现差异.....
实在太可笑了,这莫个低级幼稚的错误使得你为我费心思考,抱歉了, 再次谢谢!!!
页: [1]
查看完整版本: 【已解决】如何操作同一名称数组, 内容完全不同的问题, 谢谢!!!