Что нового

[Массивы] _ArrayMinIndex показывает лишние результаты

zerobot

Новичок
Сообщения
78
Репутация
0
Привет Всем!

У меня есть скрипт, в котором путем условий из одного массива избираются только подходящие, к примеру :
Код:
$Test[3] = 23
$Test[12] = 3
$Test[16] = 15
$Test[23] = 52
$Test[42]= 23


Я хочу узнать наименьшее значение среди них и за пределами массива использую функцию:
Код:
$MinTest = _ArrayMinIndex($Test,1)
MsgBox(0,$MinTest,$Test[$MinTest]) ;Это я пишу, чтобы посмотреть какое число оказалось наименьшим и чему оно равно.


В ответ я получаю пустое сообщение и номер массива, который вообще пуст, так как был отсеян в процессе условий.
В результате получается например, что :
Код:
$MinTest = 0
$Test[$MinTest] = ""


Как от этого избавиться? Как заставить работать функцию _ArrayMinIndex только с существующими массивами?
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
zerobot

А если так:
Код:
$MinTest = _ArrayMinIndex($Test,1,1)


У меня вот так работает:

Код:
#include <Array.au3>

Dim $aArray_1[1]

For $i = 1 To 25
	_ArrayAdd($aArray_1, $i)
Next

_ArrayDisplay($aArray_1)

$aArray_2 = _ArrayMinIndex($aArray_1,1,1)

$aArray_3 = _ArrayMaxIndex($aArray_1,1,1)

MsgBox('','','Минимальное значение = '&$aArray_2&@LF&'Максимальное значение = '&$aArray_3)
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Не знаю, может я не так оформляю, но попробуй вот такой вариант, тогда ты может лучше поймёшь в чём проблема:
Код:
#include <Array.au3>


Local $Test[50]

For $i = 1 To 25
$Test[3] = 23
$Test[12] = 3
$Test[16] = 15
$Test[23] = 52
$Test[42]= 23
Next

_ArrayDisplay($Test)

$aArray_2 = _ArrayMinIndex($Test,1,1)

MsgBox('','',$aArray_2)


В результат я получаю 1 (а должно быть 12), значение $Test[1] пустое :stars:
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
zerobot
Код:
#include <Array.au3>

Local $aArray_1[1]

For $i = 0 To 5
	_ArrayAdd($aArray_1, $i)
Next

$aArray_2 = _ArrayMinIndex($aArray_1)

$aArray_3 = _ArrayMaxIndex($aArray_1)

MsgBox('','','Минимальное значение = '&$aArray_2&@LF&'Максимальное значение = '&$aArray_3)

_ArrayDisplay($aArray_1)

Получается ищет с начала до первого совпадения.
 

glax24

Знающий
Сообщения
72
Репутация
14
Все правильно функция _ArrayMinIndex возвращает вам наименьшее, пустое или 0 это и есть наименьшее. Заполняйте весь массив или перед проверкой удаляйте пустые значения.
Код:
For $i = 1 To 25
$Test[3] = 23
$Test[12] = 3
$Test[16] = 15
$Test[23] = 52
$Test[42]= 23
Next

Зачем этот цикл если вы явно указываете индексы.
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Надо именно минимальный :scratch:


Добавлено:
Сообщение автоматически объединено:

Это лишь пример,
Код:
For $i = 1 To 25
$Test[3] = 23
$Test[12] = 3
$Test[16] = 15
$Test[23] = 52
$Test[42]= 23
Next


У меня выглядит иначе, а как удалить лишние пустые значения?

У меня что-то вроде:
Код:
If $GoodHP[$i]>0 then
$Test[$i]=$blabla+$blabla[$i]
Endif


Так как не все проходят по GoodHP то и не всем присваивается $Test и получаются пустые значения, как их убрать тогда?
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
zerobot
Работает до первого найденного минимального значения и заканчивает поиск получается.
 

glax24

Знающий
Сообщения
72
Репутация
14
Используйте разные индексы для разных массивов.

Тогда в $Test все занчения будут заполнены
Код:
Local $Test[$GoodHP[0] + 1]
$Test[0] = 0

Ваш For
If $GoodHP[$i]>0 then
$Test[0] += 1
$Test[$Test[0]]=$blabla+$blabla[$i]
Endif
Next
ReDim $Test[$Test[0] + 1]
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
zerobot
Код:
#include <Array.au3>

Local $aArray_1[1]

For $i = 1 To 49
	_ArrayAdd($aArray_1, Random(0, 50, 1))
Next
_ArrayDelete($aArray_1, _ArrayMinIndex($aArray_1))

$aArray_2 = _ArrayMinIndex($aArray_1)

$aArray_3 = _ArrayMaxIndex($aArray_1)


MsgBox('','','Минимальное значение = '&$aArray_2&@LF&'Максимальное значение = '&$aArray_3)

_ArrayDisplay($aArray_1)

Все равно до первого совпадения.
 

glax24

Знающий
Сообщения
72
Репутация
14
Или так более понятнее
Код:
;Максимальные индексы должны тогда совпадать
Local $Test[50]
Local $GoodHP[50]
Local $i = 0,$j = 0 ; i -индекс для $GoodHP,j -индекс для $Test
Local $iMinIndex

$GoodHP[1] = 0
$GoodHP[2] = 2
$GoodHP[5] = 50
$GoodHP[30] = 1


For $i = 0 To 49
If $GoodHP[$i]>0 then
$Test[$j]=$GoodHP[$i]
$j += 1
Endif
Next

ReDim $Test[$j]
_ArrayDisplay($Test)
$iMinIndex = _ArrayMinIndex($Test,1)

MsgBox('','',$iMinIndex)
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
zerobot
Вот с удалением пустых значений:
Код:
#include <Array.au3>

Local $aArray_1[50]

For $i = 1 To 50
	_ArrayAdd($aArray_1, $i)
Next

While _ArrayMinIndex($aArray_1) = '0' And _ArrayMin($aArray_1) = _ArrayMinIndex($aArray_1)

_ArrayDelete($aArray_1, _ArrayMinIndex($aArray_1))

WEnd

_ArrayUnique($aArray_1)

$aArray_2 = _ArrayMinIndex($aArray_1)

$aArray_3 = _ArrayMaxIndex($aArray_1)

MsgBox('','','Минимальное значение = '&$aArray_2&@LF&'Максимальное значение = '&$aArray_3)

_ArrayDisplay($aArray_1)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
zerobot [?]
узнать наименьшее значение среди них
Сразу заполните массив изначально большими значениями
Код:
#include <Array.au3>

Local $Test[50]

For $i = 0 To 49
  $Test[$i] = 100500
Next

$Test[3] = 23
$Test[12] = 3
$Test[16] = 15
$Test[23] = 52
$Test[42]= 23

$min = _ArrayMinIndex($Test,1)

MsgBox('','',$min)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Вытащить оригинальную функцию, упростить её и вставить проверку типа данных, если не INT, то игнорировать.
 

glax24

Знающий
Сообщения
72
Репутация
14
Код:
Func _ArrayMinIndexMod(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0)
	If Not IsArray($avArray) Then Return SetError(1, 0, -1)
	If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, -1)

	Local $iUBound = UBound($avArray) - 1

	; Bounds checking
	If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
	If $iStart < 0 Then $iStart = 0
	If $iStart > $iEnd Then Return SetError(2, 0, -1)

	Local $iMinIndex = $iStart

	; Search
	If $iCompNumeric Then
		For $i = $iStart To $iEnd
			If Not IsNumber($avArray[$i]) Then ContinueLoop ;Пропустить если не число
			If Number($avArray[$iMinIndex]) > Number($avArray[$i]) Then $iMinIndex = $i
		Next
	Else
		For $i = $iStart To $iEnd
			If $avArray[$iMinIndex] > $avArray[$i] Then $iMinIndex = $i
		Next
	EndIf

	Return $iMinIndex
EndFunc   ;==>_ArrayMinIndex
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Хм, к сожалению переделанная функция тоже пропускает пустые значения :(
 

glax24

Знающий
Сообщения
72
Репутация
14
zerobot
Используйте пример из #9 сообщения. Или так
Код:
Func _ArrayMinIndexMod(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0)
	If Not IsArray($avArray) Then Return SetError(1, 0, -1)
	If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, -1)

	Local $iUBound = UBound($avArray) - 1

	; Bounds checking
	If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
	If $iStart < 0 Then $iStart = 0
	If $iStart > $iEnd Then Return SetError(2, 0, -1)

	Local $iMinIndex = $iStart
	Local $iCheckNum = 0

	; Search
	If $iCompNumeric Then
		For $i = $iStart To $iEnd
			If Not IsNumber($avArray[$i]) Then ContinueLoop ;Пропустить если не число
			If Not $iCheckNum Then $iMinIndex = $i
			$iCheckNum = 1
			If Number($avArray[$iMinIndex]) > Number($avArray[$i]) Then $iMinIndex = $i
		Next
	Else
		For $i = $iStart To $iEnd
			If $avArray[$iMinIndex] > $avArray[$i] Then $iMinIndex = $i
		Next
	EndIf

	Return $iMinIndex
EndFunc   ;==>_ArrayMinIndexMod
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
zerobot
Вот без редактирования функции:
Код:
#include <Array.au3>

Local $Test[50]

For $i = 1 To 25
$Test[3] = 23
$Test[12] = 3
$Test[16] = 15
$Test[23] = 52
$Test[42]= 33
$Test[43]= 27
$Test[22]= 26
$Test[32]= 25
$Test[11]= 24
Next

_ArrayDisplay($Test)

$stringArray = _ArrayToString($Test, ', ')
$stringArray2 = StringRegExpReplace($stringArray, '\s?[\,]', '')
$aDays = StringSplit($stringArray2, ' ,', 2)

While _ArraySearch($aDays, '') <> @error
	_ArrayDelete($aDays, _ArraySearch($aDays, ''))
WEnd

;_ArrayDelete($aDays, 0)
_ArrayDelete($aDays, UBound($aDays)-1)

_ArrayDisplay($aDays)
$aArray_2 = _ArrayMinIndex($aDays,1,1)

MsgBox('','',$aArray_2)
 
Верх