Что нового

Добавление условий в цикл (For... Next)

Trans

Знающий
Сообщения
257
Репутация
6
Доброго времени суток, ребят, подскажите пожалуйста, есть ли какой нибудь метод добавить в цикл
Код:
For $i=0 To Ubound($a)-1

Условия, т.е. при каких действиях, цикл идёт дальше, а при каких приостанавливается.
Пример
Код:
For $i=0 To Ubound($a)-1
If $c=1 then
;Выполняем какое-то действие,
ElseIf $c=0 then 
MsgBox(0,'','строка:'$i)
Next
EndIf

т.е. если переменная "$c"=1, то скрипт выполняет какое-то действие, но при этом не увеличивается значение переменно "$i"
-Как-то так представляю себе это, вот только синтакс не позволяет)

PS... Пока писал сообщение, появилась мысль принудительно занижать значение $i вычетом -1 ($i=$i-1), но такой вариант тоже не особо хорош)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Trans [?]
но такой вариант тоже не особо хорош
Чем же плох?
Код:
Local $a[10] = [0,0,0,1,0,0,1,1,0,0]

For $i = 0 To Ubound($a) -1

	$c = $a[Random(0, 9, 1)]
	Switch $c
		Case 1
			ConsoleWrite('Выполняем какое-то действие...' & @CRLF)
			$i -=1
		Case 0
			MsgBox(64, @ScriptName, 'строка: #' & $i, 1)
	EndSwitch
Next
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Главное добавить Sleep, чтобы при переключении в режим кручения цикла на месте он не жрал ресурсы процессора. Но только при при событии минуса, а не в общем потоке.
 
Автор
T

Trans

Знающий
Сообщения
257
Репутация
6
Придётся значит переменную занижать ))
Жаль что в AutoIt'е нету мультизадачности)
Было бы куда проще решать разные задачи))
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Trans
А такой вариант вас не устроит?
Код:
Global $c = 0

AdlibRegister('_myfunc')


While 1
	Sleep(3000)
	$c = Not $c
WEnd


Func _myfunc()
	
	Switch $c
        Case 1
            ConsoleWrite('Выполняем какое-то действие...' & @CRLF)
        Case 0
            ConsoleWrite('Простой...' & @CRLF)
	EndSwitch
EndFunc ;==>_myfunc
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Trans
Какая ещё мультизадачность? Вы думаете на С++ вы будете открывать новый поток, чтобы там как то регулировать цикл? Если вы в простейшем цикле запутались как вы собираетесь управлять потоками, для которых синхронизация флагами на порядок сложнее. Движок организации потоков потребует больше кода, больше обслуживающей инфраструктуры.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Trans [?]
вот только синтакс не позволяет
Ну, почему же? Цикл For специально был придуман для того, чтобы не заморачиваться со счётчиком. Если вам нужно управлять счётчиком самостоятельно, то используйте другие циклы. Например
Код:
$i = 0
While $i < UBound($a)
  If $c Then
    ; Выполняем какое-то действие
  Else
    $i += 1 ; увеличиваем счётчик
  EndIf
WEnd
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Trans
Код:
Global $i = 0
While 1
	For $i=$i To 1
		If 1 Then
			; ...
			ExitLoop ; $i не меняем. Выходим из цикла
		EndIf
	Next
	; Попадем сюда
	If 1 Then ExitLoop ; Без условия выхода из While получится бесконечный цикл
WEnd
 
Верх