Что нового

[Баг] в UDF Array.au3

Luke

Знающий
Сообщения
64
Репутация
14
В строке вида $avArray[0]=_ArrayAdd($avArray, "значение") присваивание не работает.
пример:
Код:
#include <Array.au3>

Local $avArray[3]

$avArray[0] = "JPM"
$avArray[1] = "Holger"
$avArray[2] = "Jon"

_ArrayDisplay($avArray, "$avArray BEFORE _ArrayDelete()")
$avArray[0]=_ArrayAdd($avArray, "Brian")
_ArrayDisplay($avArray, "$avArray AFTER _ArrayDelete()")

не выдает результат описанный в справке ($avArray[0] останется равной "JPM"), но при такой записи
Код:
#include <Array.au3>

Local $avArray[3]

$avArray[0] = "JPM"
$avArray[1] = "Holger"
$avArray[2] = "Jon"

_ArrayDisplay($avArray, "$avArray BEFORE _ArrayDelete()")
$a=_ArrayAdd($avArray, "Brian")
$avArray[0] =$a
_ArrayDisplay($avArray, "$avArray AFTER _ArrayDelete()")

получается ожидаемый результат ($avArray[0] cтанет равно 3)
аналогично в других функциях этой UDF, так что можно сказать фича.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
А где тут Баг? :blink:

Luke [?]
не выдает результат описанный в справке
В справке я чего-то не видел, чтобы было написано, что в массив должен добавляется индекс добавляемого элемента.
Вот ваш случай (фича). ;)
Код:
#include <Array.au3>

Local $avArray[3]

$avArray[0] = "JPM"
$avArray[1] = "Holger"
$avArray[2] = "Jon"

_ArrayDisplay($avArray, "$avArray BEFORE _ArrayDelete()")
_ArrayInsert($avArray, 0,_ArrayAdd($avArray, "Brian")+1)
_ArrayDisplay($avArray, "$avArray AFTER _ArrayDelete()")
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
Насколько я понял из справки функция _ArrayAdd() при успешном выполнении должна возвращать индекс последнего добавленного элемента.
Теперь представим что я хочу получить массив $avArray в котором под индексом 0 всегда хранился бы индекс последнего добавленного элемента, логично это записать так:
Код:
$avArray[0]=_ArrayAdd($avArray, "Значение")
, но такая запись не работает, присваивания нового значения $avArray[0] не происходит (в этом и баг), хотя если использовать дополнительную промежуточную переменную то $avArray[0] можно изменить:
Код:
$a=_ArrayAdd($avArray, "Значение")
$avArray[0] =$a


Вообщем эти две записи не эквивалентны. Первая ничего не делает (не присваивает)
 

axlwor

Скриптер
Сообщения
657
Репутация
147
странно. у меня
$avArray[индекс]=_ArrayAdd($avArray, "Значение")
вообще вызывает ошибку
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
У меня никаких ошибок не выдает, просто не присваивает. Из-за этого долго искал где ошибка в логике программы, вот написал чтоб другие не наступали на те же грабли.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Luke [?]
но такая запись не работает, присваивания нового значения $avArray[0] не происходит (в этом и баг)
Ещё раз повторюсь, это не баг. Посмотрите мою функцию и стандартную функцию, и посмотрите в чём отличие. Потом почитайте в справке про ByRef, в частности Remarks и вы поймете, в чём дело, и почему автор применил в функции ByRef. Однако он почему-то пренебрёг макросом @extended.

Код:
#include <Array.au3>

Local $avArray[3]

$avArray[0] = "JPM"
$avArray[1] = "Holger"
$avArray[2] = "Jon"
_ArrayDisplay($avArray, "$avArray BEFORE _ArrayDelete()")
$avArray[0] = _ArrayAdd($avArray, "Brian")
_ArrayDisplay($avArray, "$avArray BEFORE _ArrayDelete()")
_ArrayAddEx($avArray, "Luke")
$avArray[0] = @extended
_ArrayDisplay($avArray, "$avArray BEFORE _ArrayDelete()")

; Extended function
Func _ArrayAddEx(ByRef $avArray, $vValue)
	If Not IsArray($avArray) Then Return SetError(1, 0, -1)
	If UBound($avArray, 0) <> 1 Then Return SetError(2, 0, -1)

	Local $iUBound = UBound($avArray)
	ReDim $avArray[$iUBound + 1]
	$avArray[$iUBound] = $vValue
	Return SetExtended($iUBound)
EndFunc   ;==>_ArrayAddEx
 
Верх