Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
сделал нужные для себя функции связанные с массивами
несколько замечаний... и свой вариант.
- во избежание проблем индексные переменные в функциях нужно объявлять как Local;
- пустые массивы (счетчик со значением 0) нужно обрабатывать отдельно перед входом в цикл;
- учитывая, что счет индекса идет всегда с единицы, одной проверки IsArray() явно недостаточно. На самом деле все приведенные функции работают с пользовательским типом данных - "массив со счетчиком"… вот на принадлежность этому типу и надо проверять. Более того, при наличии уверенности в корректности массива можно обойтись без лишнего пользования UBound() - достаточно взять значение по индексу 0.
- параметр $JoinedArray в функции _ArrayJoin() имхо избыточный, при нужде поменять параметры проблемы не составит:
Код: Выделить весь код
If $JoinedArray Then
    _ArrayJoin ($arr1, $arr2)
Else
    _ArrayJoin ($arr2, $arr1)
EndIf
- зачем нужна _ArrayClear(), если можно обычным оператором присвоения переинициализировать массив?
- в функции _ArrayReplace две строки перепутаны местами.
Код: Выделить весь код
#include <Array.au3>

Func _IsCountArray (ByRef $arr)
    If IsArray ($arr) Then
        If $arr[0] = UBound ($arr)-1 Then Return True
    EndIf
    Return False
EndFunc

Func _ArrayJoin (ByRef $arrFrom, ByRef $arrTo)
    If _IsCountArray($arrFrom) And _IsCountArray($arrTo) Then
        Local $i, $n=0
        If $arrFrom[0] =0 Then Return 0
        For $i=1 To $arrFrom[0]
            $n+=_ArrayAdd ($arrTo, $arrFrom [$i])
        Next
        $arrTo[0]+=$n
        Return $n
    EndIf
    SetError (1)
    Return -1
EndFunc

Func _ArrayClone (ByRef $arr, $count = 1)
    Local $i, $n=0, $tmp = $arr
    If _IsCountArray ($arr) Then
        For $i=1 To $count
            $n+=_ArrayJoin ($tmp, $arr)
        Next
        Return $n
    EndIf
    SetError(1)
    Return -1
EndFunc

Func _ArrayDeleteClones (ByRef $arr, $iCaseSense = 0)
    If _IsCountArray ($arr) Then
        Local $i, $n=0, $iClone
        If $arr[0] <2 Then Return 0
        For $i=$arr[0] To 2 Step -1
            $iClone = _ArraySearch ($arr, $arr[$i], 1, $i-1, $iCaseSense)
            If $iClone >0 Then
                $n+=_ArrayDelete ($arr, $iClone)
                $i-=1
            EndIf
        Next
        $arr[0] = UBound($arr) -1
        Return $n
    EndIf
    SetError(1)
    Return -1
EndFunc

Func _ArrayReplace (ByRef $Array, $ValueToReplace, $NewValue)
    Local $i, $n=0
    If _IsCountArray($Array) And IsString ($ValueToReplace) Then
        For $i = 1 To $Array[0]
            If StringInStr ($Array[$i], $ValueToReplace) Then
                $Array[$i] = StringReplace ($Array[$i], $ValueToReplace, $NewValue)
                $n+=1
            EndIf
        Next
        Return $n
    EndIf
    SetError(1)
    Return -1
EndFunc
Цитата:
А как определять является ли массив двухмерным, или нет?
UBound ($Array,0) вернет размерность массива
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:40, 19-02-2007 | #211