Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Изменение счётчика итераций цикла (http://forum.oszone.net/showthread.php?t=326993)

Паразит 23-05-2017 10:16 2738883

Изменение счётчика итераций цикла
 
Привет.

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


Код:

$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 2738904

Цитата:

Цитата Паразит
Всегда выдаётся ошибка, что массив имеет неправильное количество индексов.»

Не вижу у вас массива.

Изменить количество итераций можно как-то так, например
Код:

#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 2738926

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


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

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

oz84 23-05-2017 14:17 2738955

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

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

Паразит 23-05-2017 14:41 2738972

Получается, что переменная StopValue читается только при первом проходе.

Вывод:

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

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

Creat0R 25-05-2017 21:09 2739659

Цитата:

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

Это изначально неверный подход.

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

Код:

$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



Время: 22:45.

Время: 22:45.
© OSzone.net 2001-