PDA

Показать полную графическую версию : Изменение счётчика итераций цикла


Паразит
23-05-2017, 10:16
Привет.

Допустим, у меня есть некий цикл, он работает, как нужно, но в определённый момент, мне нужно изменить количество итераций цикла.
Из вне. Из другой функции.
Возможно ли такое в принципе?



$Arr = 7

For $i = 0 To $Arr
MsgBox(0, "111", $i)
; If $i = 3 Then ExitLoop
Next


Func _bbb()
;И отсюда, по некому событию я хочу изменить $Arr
EndFunc





Изменить $Arr. Хоть, прибавить, хоть убавить.
Как такое реализовать?
Всегда выдаётся ошибка, что массив имеет неправильное количество индексов.

Я думал про ReDim, но как не крутил, ничего не получилось.
Для примера, я хочу, чтобы было не 7, а 12 итераций.

oz84
23-05-2017, 11:28
Всегда выдаётся ошибка, что массив имеет неправильное количество индексов.»
Не вижу у вас массива.

Изменить количество итераций можно как-то так, например
#NoTrayIcon
Local $iCount = 1, $iMax = 7

HotKeySet("{F2}", "_bbb")

While 1
If $iCount = $iMax Then ExitLoop
MsgBox(0, "111", $iCount)
$iCount += 1
Sleep(10)
WEnd


Func _bbb()
$iMax = 12
EndFunc ;==>_bbb

Паразит
23-05-2017, 12:48
Я не стал писать про массив, потому что массив мне возвращает некоторую цифру (через UBound).
Т.е., это всего лишь цифра, которую мне нужно изменить, при появлении некоторого события.


oz84, а можно ли это реализовать через For To Next?

Дело в том, что мой скрипт очень сложен, и я от этого цикла получаю не только его тело, но и его индекс,
который используется в других местах скрипта.

oz84
23-05-2017, 14:17
Паразит, тут идексом будет $iCount, такой же счётчик, как и $i (только если $i = 0, то количество итераций будет 8, а не 7). Извиняюсь, в последнее время чаще был удобен бесконечный цикл с выходом по условию, ну и написал по привычке...

Можно и в For, только нужно добавить проверку, что не выходите за пределы размера массива, до того, как получить из него некоторую цифру. Т.е. предусмотреть в скрипте ошибку, тогда до обработчика ошибок самого AutoIt дело и не дойдёт.

Паразит
23-05-2017, 14:41
Получается, что переменная StopValue читается только при первом проходе.

Вывод:

Через For To Next реализовать такое невозможно.

oz84, спасибо Вам за помощь.

Creat0R
25-05-2017, 21:09
мой скрипт очень сложен, и я от этого цикла получаю не только его тело, но и его индекс,
который используется в других местах скрипта. »
Это изначально неверный подход.

Что касается проверки массива, не вижу тут проблемы:

$i = 0
$Arr = 7
Dim $aArray[$Arr]

Do
MsgBox(0, "111", $i)

If $i < UBound($aArray) Then
;Some action with the array ($aArray[$i])
ConsoleWrite($aArray[$i] & @CRLF)
EndIf

If $i = 3 Then
_bbb()
EndIf

$i += 1
Until $i = $Arr

Func _bbb()
$Arr = 12
EndFunc




© OSzone.net 2001-2012