Что нового

[Данные, строки] Вопрос про цикл

Статус
Закрыто для дальнейших ответов.

modnik

Знающий
Сообщения
138
Репутация
13
Код:
$c = 0
for $i= 1 to $orders
$n = ControlListView("[TITLE:EVE ;]", _
"","WindowsForms10.SysListView32.app.0.378734a1", "Finditem" , $s[$c])
$c = $c+1
next
if $d =0 then
$c = $c+1
Next

Такой цикл. Если переменная $d равно нулю то мне нужно прервать цикл выполнить сначала, только, чтобы счётчик не изменился(i), т.е повторить цикл для того же числа на котором он прервался. Как так сделать?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Малопонятная задача
Где об,явлены : $d, $orders да и массив $s[$c] надо прежде декларировать ?
Яснее вырази задачу



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

Принцип организации подобных циклов может быть таким :
Код:
$c = 0
Do 
   $n=0 
   for $i= $c to 20
	  $c = $c+1 ; Счетчик
	  $n =$n+1 ; Проверяемый параметр
	  MsgBox(0,'$c',$c,1)
	  If $n =5 Then ExitLoop
   next
Until $c > 20
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Код:
$orders =28
dim $s[$orders]
$c = 0
for $i= 1 to $orders
$n = ControlListView("[TITLE:EVE ;]", _
"","WindowsForms10.SysListView32.app.0.378734a1", "Finditem" , $s[$c])


$d= PixelGetcolor(x,y)
if $d=17658687  ;здесь нужно заново начать цикл,только чтобы с не изменилось, также не изменилось номер повторения
$c = $c+1
Next
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Можно так :
Код:
$orders =28
dim $s[$orders]
$c = 0

Do 
for $i= $c to $orders
   $n = ControlListView("[TITLE:EVE ;]", _
   "","WindowsForms10.SysListView32.app.0.378734a1", "Finditem" , $s[$c])
   $d= PixelGetcolor(x,y)
   ;if $d=17658687  ;здесь нужно заново начать цикл,только чтобы с не изменилось, также не изменилось номер повторения
   if $d=17658687 Then ExitLoop
   $c = $c+1
Next
;Until $c >56 ; Здесь надо ограничить кол-во циклов 
Until $c =$orders ; Ограничение по размеру массива
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
так же тоже верно?
Код:
$orders =28
dim $s[$orders]
$c = 0
$f=$orders
Do 
for $i= $c to $orders
   $n = ControlListView("[TITLE:EVE ;]", _
   "","WindowsForms10.SysListView32.app.0.378734a1", "Finditem" , $s[$c])
   $d= PixelGetcolor(x,y)
   ;if $d=17658687  ;здесь нужно заново начать цикл,только чтобы с не изменилось, также не изменилось номер повторения
   if $d=17658687 Then $f = $f+1 ExitLoop
   $c = $c+1
Next
Until $c >f;
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
modnik [?]
так же тоже верно?
Подправил
Код:
$orders =28
dim $s[$orders]
$c = 0
$f=$orders
Do 
for $i= $c to $orders
   $n = ControlListView("[TITLE:EVE ;]", _
   "","WindowsForms10.SysListView32.app.0.378734a1", "Finditem" , $s[$c])
   $d= PixelGetcolor(x,y)
   ;if $d=17658687  ;здесь нужно заново начать цикл,только чтобы с не изменилось, также не изменилось номер повторения
  ;if $d=17658687 Then $f = $f+1 ExitLoop ;  нельзя совмещать в одной строке несколько операторов/команд
   if $d=17658687 Then 
        $f = $f+1 
        ExitLoop
   EndIf
   $c = $c+1
Next
;Until $c >f
Until $c > $f

Но у тебя надо еще ввести ограничение по об"явленному размеру массива ($orders) или делать ReDim массива


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

Или у тебя $c > $f и есть попытка ограничения по размеру массива ?
Тогда :
Код:
if $d=17658687 Then 
    $f = $f+1 
    ReDim $s[$f]
     ExitLoop
EndIf
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
gregaz [?]
Также нужно ещё объяснить опоненту, что условие таким образом не делается, т.е нельзя совмещать в одной строке несколько операторов/команд.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
Также нужно ещё объяснить опоненту, что условие таким образом не делается, т.е нельзя совмещать в одной строке несколько операторов/команд.

Сделал в виде комментария к ошибочной записи
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Т.е у меня 28 строчек. МНе нужно их обработать 28 раз. Если там возникает ошибка и мне надо вернуться, тообработать их 29 раз.
Т.е получается последний раз, с переобьявлением массива?

Меня ещё смущает вот эта строчка
Код:
$c = 0
$f=$orders
Do 
for $i= $c to $orders

Выходит, что если строчек будет 28, то цикл прокрутиться 29 раз, так как с нуля. Нужно вычитать единичку из ордерс?


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

И
ещё. у меня массив $c содержит строки(слова), и каждый номер это определённая строка. я Не пойму, что ему даст
Код:
if $d=17658687 Then 
    $f = $f+1 
    ReDim $s[$f]
     ExitLoop
EndIf
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Получается, что если был поторный проход, то в какой то момент скрипт захочет проверить $c[29], а такого как бы нету
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
modnik [?]
Получается, что если был поторный проход, то в какой то момент скрипт захочет проверить $c[29], а такого как бы нету

У тебя была поставлена задача :
Выполнить цикл , если выполняется условие : $d= PixelGetcolor(x,y), то повторить цикл , не обнуляя при этом счетчик $c.
Из -за того ,что при этом $c будет превышать размер массива и делаем Redim. А теперь говоришь $c[29] нету. ( Наверное $s ?)

Ты яснее обрисуй еще раз задачу
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Да, я имел ввиду$s, остальное ты правильно понял
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Если массив не должен меняться , то перед : $n = ControlListView............. введи ограничение по об"явленному размеру массива (Не делая ReDim ) :
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Если не сложно, напиши код пожалуйста
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
modnik [?]
Если не сложно, напиши код пожалуйста

If $c > $orders Then Exit

Мне вообще непонятно зачем тебе надо повторный проход цикла ?

Может у тебя задача такая ?

Пройти по всем элементам массива
Если выполняется условие : $d= PixelGetcolor(x,y), то пропустить этот элемент массива и пройти до конца массива ?
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Задача такая:
Нужно пройтись по всем элементам массива. Если в определёный момент цикла выполняется условие $d= PixelGetcolor(x,y), то это значит, что в игре появилось сообщение об ошибке. В этом случае нужно повторить все предыдущие действия при тех же условия на котором возникла ошибка($d= PixelGetcolor(x,y)). Это нужно сделать так как при повтороном проходе эта ошибка исчезнет, и цикл пойдёт дальше
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
modnik [?]
адача такая:
Нужно пройтись по всем элементам массива. Если в определёный момент цикла выполняется условие $d= PixelGetcolor(x,y), то это значит, что в игре появилось сообщение об ошибке. В этом случае нужно повторить все предыдущие действия при тех же условия на котором возникла ошибка($d= PixelGetcolor(x,y)). Это нужно сделать так как при повтороном проходе эта ошибка исчезнет, и цикл пойдёт дальш

В новом цикле тот же массив ?
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Я не совсем понял. Как я представляю себе ситуацию, там тот же массив, тот же цикл, просто обрабатываемый элемент массива тот же
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
modnik [?]
Я не совсем понял. Как я представляю себе ситуацию, там тот же массив, тот же цикл, просто обрабатываемый элемент массива тот же

Ты сам понял,что написал?

Если так ,то почему не обнулять каждый раз счетчик $c массива ?
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Код:
$orders =5
dim $s[$orders]
$c = 0
for $i= $c to $orders
   $n = ControlListView("[TITLE:EVE ;]", _
   "","WindowsForms10.SysListView32.app.0.378734a1", "Finditem" , $s[$c])
   $d= PixelGetcolor(x,y)
   ;if $d=17658687  ;здесь нужно заново начать цикл,только чтобы с не изменилось, также не изменилось номер повторения
 
   $c = $c+1
Next


Массив
$s содержит 5 букв A B C D E
$n поочерёдно возвращает номер строки, под которым значиться буква

Допустим в данный момент цикл идёт 3 раз, тогда $c=2, $n вернёт номер строки. И тут выполняется условие, что $d=17658687, в этом случае нужно начать цикл сначала, т.е, чтобы $c=2 и цикл снова шёл 3 раз
 
Статус
Закрыто для дальнейших ответов.
Верх