找回密码
 加入
搜索
查看: 2551|回复: 7

[原创] 发现_ArraySearch函數的一处笔误,.给大家提个醒

  [复制链接]
发表于 2017-7-5 10:21:05 | 显示全部楼层 |阅读模式
本帖最后由 tubaba 于 2020-2-27 09:14 编辑

无意中发现的,造成脚本错误,结果找到这行..给大家提个醒,存在于版本3.14.2中,在下面第94行
Func _ArraySearch(Const ByRef $aArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iCompare = 0, $iForward = 1, $iSubItem = -1, $bRow = False)

        If $iStart = Default Then $iStart = 0
        If $iEnd = Default Then $iEnd = 0
        If $iCase = Default Then $iCase = 0
        If $iCompare = Default Then $iCompare = 0
        If $iForward = Default Then $iForward = 1
        If $iSubItem = Default Then $iSubItem = -1
        If $bRow = Default Then $bRow = False

        If Not IsArray($aArray) Then Return SetError(1, 0, -1)
        Local $iDim_1 = UBound($aArray) - 1
        If $iDim_1 = -1 Then Return SetError(3, 0, -1)
        Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1

        ; Same var Type of comparison
        Local $bCompType = False
        If $iCompare = 2 Then
                $iCompare = 0
                $bCompType = True
        EndIf
        ; Bounds checking
        If $bRow Then
                If UBound($aArray, $UBOUND_DIMENSIONS) = 1 Then Return SetError(5, 0, -1)
                If $iEnd < 1 Or $iEnd > $iDim_2 Then $iEnd = $iDim_2
                If $iStart < 0 Then $iStart = 0
                If $iStart > $iEnd Then Return SetError(4, 0, -1)
        Else
                If $iEnd < 1 Or $iEnd > $iDim_1 Then $iEnd = $iDim_1
                If $iStart < 0 Then $iStart = 0
                If $iStart > $iEnd Then Return SetError(4, 0, -1)
        EndIf
        ; Direction (flip if $iForward = 0)
        Local $iStep = 1
        If Not $iForward Then
                Local $iTmp = $iStart
                $iStart = $iEnd
                $iEnd = $iTmp
                $iStep = -1
        EndIf

        Switch UBound($aArray, $UBOUND_DIMENSIONS)
                Case 1 ; 1D array search
                        If Not $iCompare Then
                                If Not $iCase Then
                                        For $i = $iStart To $iEnd Step $iStep
                                                If $bCompType And VarGetType($aArray[$i]) <> VarGetType($vValue) Then ContinueLoop
                                                If $aArray[$i] = $vValue Then Return $i
                                        Next
                                Else
                                        For $i = $iStart To $iEnd Step $iStep
                                                If $bCompType And VarGetType($aArray[$i]) <> VarGetType($vValue) Then ContinueLoop
                                                If $aArray[$i] == $vValue Then Return $i
                                        Next
                                EndIf
                        Else
                                For $i = $iStart To $iEnd Step $iStep
                                        If $iCompare = 3 Then
                                                If StringRegExp($aArray[$i], $vValue) Then Return $i
                                        Else
                                                If StringInStr($aArray[$i], $vValue, $iCase) > 0 Then Return $i
                                        EndIf
                                Next
                        EndIf
                Case 2 ; 2D array search
                        Local $iDim_Sub
                        If $bRow Then
                                ; Search rows
                                $iDim_Sub = $iDim_1
                                If $iSubItem > $iDim_Sub Then $iSubItem = $iDim_Sub
                                If $iSubItem < 0 Then
                                        ; will search for all Col
                                        $iSubItem = 0
                                Else
                                        $iDim_Sub = $iSubItem
                                EndIf
                        Else
                                ; Search columns
                                $iDim_Sub = $iDim_2
                                If $iSubItem > $iDim_Sub Then $iSubItem = $iDim_Sub
                                If $iSubItem < 0 Then
                                        ; will search for all Col
                                        $iSubItem = 0
                                Else
                                        $iDim_Sub = $iSubItem
                                EndIf
                        EndIf
                        ; Now do the search
                        For $j = $iSubItem To $iDim_Sub
                                If Not $iCompare Then
                                        If Not $iCase Then
                                                For $i = $iStart To $iEnd Step $iStep
                                                        If $bRow Then
                                                                If $bCompType And VarGetType($aArray[$j][$j]) <> VarGetType($vValue) Then ContinueLoop    ;这里笔误,$aArray[$j][$j]实为$aArray[$j][$i]
                                                                If $aArray[$j][$i] = $vValue Then Return $i
                                                        Else
                                                                If $bCompType And VarGetType($aArray[$i][$j]) <> VarGetType($vValue) Then ContinueLoop
                                                                If $aArray[$i][$j] = $vValue Then Return $i
                                                        EndIf
                                                Next
                                        Else
                                                For $i = $iStart To $iEnd Step $iStep
                                                        If $bRow Then
                                                                If $bCompType And VarGetType($aArray[$j][$i]) <> VarGetType($vValue) Then ContinueLoop
                                                                If $aArray[$j][$i] == $vValue Then Return $i
                                                        Else
                                                                If $bCompType And VarGetType($aArray[$i][$j]) <> VarGetType($vValue) Then ContinueLoop
                                                                If $aArray[$i][$j] == $vValue Then Return $i
                                                        EndIf
                                                Next
                                        EndIf
                                Else
                                        For $i = $iStart To $iEnd Step $iStep
                                                If $iCompare = 3 Then
                                                        If $bRow Then
                                                                If StringRegExp($aArray[$j][$i], $vValue) Then Return $i
                                                        Else
                                                                If StringRegExp($aArray[$i][$j], $vValue) Then Return $i
                                                        EndIf
                                                Else
                                                        If $bRow Then
                                                                If StringInStr($aArray[$j][$i], $vValue, $iCase) > 0 Then Return $i
                                                        Else
                                                                If StringInStr($aArray[$i][$j], $vValue, $iCase) > 0 Then Return $i
                                                        EndIf
                                                EndIf
                                        Next
                                EndIf
                        Next
                Case Else
                        Return SetError(2, 0, -1)
        EndSwitch
        Return SetError(6, 0, -1)
EndFunc   ;==>_ArraySearch

评分

参与人数 1金钱 +50 收起 理由
afan + 50 赞一个!

查看全部评分

发表于 2017-7-6 09:18:09 | 显示全部楼层
支持一下,这么细心。谢谢了
发表于 2017-7-6 20:32:10 | 显示全部楼层
这函数现在不用了
 楼主| 发表于 2017-7-7 09:54:10 | 显示全部楼层
回复 3# Mr丶KQ


    用什么来替代?
发表于 2017-7-7 17:41:55 | 显示全部楼层
回复 4# tubaba

这个函数100以内的数组还行
1000以上的,我是用双循环的
发表于 2017-7-27 13:53:48 | 显示全部楼层
楼主,标题的函数名拼错啦,应该是 _ArraySearch
发表于 2017-7-27 21:00:37 | 显示全部楼层
学习了,楼主犀利啊
 楼主| 发表于 2020-2-27 09:15:22 | 显示全部楼层
帆船 发表于 2017-7-27 13:53
楼主,标题的函数名拼错啦,应该是 _ArraySearch

笔误,改过来了....
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 04:25 , Processed in 0.097764 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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