tubaba 发表于 2017-7-5 10:21:05

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

本帖最后由 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

redapple2008 发表于 2017-7-6 09:18:09

支持一下,这么细心。谢谢了

callmekq 发表于 2017-7-6 20:32:10

这函数现在不用了

tubaba 发表于 2017-7-7 09:54:10

回复 3# Mr丶KQ


    用什么来替代?

callmekq 发表于 2017-7-7 17:41:55

回复 4# tubaba

这个函数100以内的数组还行
1000以上的,我是用双循环的

帆船 发表于 2017-7-27 13:53:48

楼主,标题的函数名拼错啦,应该是 _ArraySearch

yhp2012 发表于 2017-7-27 21:00:37

学习了,楼主犀利啊

tubaba 发表于 2020-2-27 09:15:22

帆船 发表于 2017-7-27 13:53
楼主,标题的函数名拼错啦,应该是 _ArraySearch

笔误,改过来了....
页: [1]
查看完整版本: 发现_ArraySearch函數的一处笔误,.给大家提个醒