Русское сообщество AutoIt

  • Май 25, 2013, 02:14:57 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:

Создан файловый архив для участников форума.

Закачивайте свои файлы и получайте рейтинг, прямые ссылки, и т.п.

Для изображений и скриншотов по прежнему есть AUTOIT.RV.UA

Реклама

Автор Тема: выход из цикла после полной проверки по массиву  (Прочитано 1124 раз)

0 Пользователей и 1 Гость смотрят эту тему.

running-frag [?]

Задача така. Есть массив, ну допустим (полностью не буду описывать)
Код: AutoIt [Выделить]
...
$stClient[1][3] = True
...
$stClient[2][3] = False
...
и есть функция
Код: AutoIt [Выделить]
Func _window_checkAllClients ()
    Local $_return = False
   
    While Not ($_return)
       
        For $i = 1 To 4
            If $stClient[$i][3] Then
                If _window_checkLocation ($stClient[$i][2], True, True) Then ; вот тут нужно изменять чекер $_return
            EndIf
        Next
       
    WEnd   
   
    Return True
EndFunc

Теперь задача.
Задача функции пробежать все элементы массива (ну в данный момент у нас получается только 4). На накоторых выполняется функция _window_checkLocation (), которая отдаёт True\False. Теперь чего хочется от этой функции. Нужно что бы мы вышли из цикла (While Not $_return) только тогда, когда все вызовы функции _window_checkLocation () отдали нам True. Если хотя бы один элемент отдал False - катаемся дальше по циклу.

Чего то кручу верчу нефига не получается.


Добавлено: Май 01, 2012, 00:04:56
Вот ещё вариант родил.
Код: AutoIt [Выделить]
Func _window_checkAllClients ()
    Local $_result = True
    Local $_chr = 4 ; предпологается что в массиве будет всего четыре значения True
    Local $_sum = 0
   
    While True
       
        For $i = 1 To $_chr
            If $stClient[$i][3] Then
                _client_makeActive ($stClient[$i][1])
                If _window_checkLocation ($stClient[$i][2], True, True) Then $_sum += 1
                    ; вот тут нужно изменять чекер
            EndIf
        Next
       
        If $_sum = 4 Then ExitLoop
       
        $_sum = 0
    WEnd   
   
    Return True
EndFunc
 

Но это не подойдёт т.к. нам нужна будет ещё функция для определение количество $_chr (количество значений True из массива $stClient[$i][3]). А хочется без неё.


Добавлено: Май 01, 2012, 00:06:00
OffTopicНазвал тему не так, сейчас переименую.
« Последнее редактирование: Май 01, 2012, 00:08:11 от running-frag, Причина: Объединение сообщений »



  Записан
"Слушай всех, но делай по своему." (с)
"Что бы понять что написано в коде, нужно его переписать." (с)
"Нет ничего более постоянного, чем временное." (c)
"В нашей жизни, изменить можно всё... Кроме смерти." (с)

Big Boss Inform. отображение текущих координат, захват цвета

Viktor1703 [?]

Сделайте функцию для проверки валидности всех элементов массива и вставьте в цикл, если эта функция вернёт 1 то выходим из цикла.

Например такая функция:

Код: AutoIt [Выделить]
Func ValidArray(ByRef $aArray)
    If Not IsArray($aArray) Then
        Return -1
    EndIf  
    For $i = 1 To $aArray[0][0]
        If (Not $aArray[$i][3]) Then
            Return 0
        EndIf  
    Next
    Return 1
EndFunc
 
« Последнее редактирование: Май 01, 2012, 00:15:13 от Viktor1703 »



  Записан
кто здесь? о_О

running-frag [?]

  • Продвинутый
  • ***

  • Автор темы
  • Репутация: 57
  • Offline Offline
  • Сообщений: 440
  • why me?
    • Награды
Немного не понял как это работает. Ам, давай ещё раз расскажу смысл (я плохой оратор я вкусре  ;D).

Есть массив (статически, т.е. мы его никак не будем менять) $stClient. Сколько у нас элементов в нём, неизвестно. Каждый элемент это массив (вложенный). Т.е. как описано выше $stClient[$i][3] это флаг, стоит ли нам делать проверку (выполнять нашу функцию) или нет.

Так вот мы запускаем цикл (While) и после проверям все элементы (получается только те что $stClient[$i][3] == True), если хотя бы один элемент нам отдал False (из _window_checkLocation ($stClient[$i][2], True, True)) тогда мы продолжаем цикл While (т.е. For добегает до конца своим ходом). А если же все элементы (те что _window_checkLocation ($stClient[$i][2], True, True)) отдали True - выходим из цикла (While).

Viktor1703 если ты именно об этом писал то плз напиши на моём примере, я не понял как это работает. :(




  Записан

Viktor1703 [?]

Объясню на одномерном массиве

Код: AutoIt [Выделить]
Dim $aTest[5]
$aTest[0] = True
$aTest[1] = True
$aTest[2] = True
$aTest[3] = False
$aTest[4] = True

$i = 0

While 1
    If ValidArray($aTest) Then
        ExitLoop
    EndIf  
    ConsoleWrite($i & @CRLF)
    $i += 1
    If $i >= 500 Then
        $aTest[3] = True
    EndIf  
Wend   

Func ValidArray(ByRef $aArray)
    If Not IsArray($aArray) Then
        Return -1
    EndIf  
    For $i = 0 To UBound($aArray) -1
        If (Not $aArray[$i]) Then
            Return 0
        EndIf  
    Next
    Return 1
EndFunc
 

Ну или вот на двумерном массиве

Код: AutoIt [Выделить]
Dim $aTest[6][4]
$aTest[0][0] = UBound($aTest) - 1
$aTest[1][3] = True
$aTest[2][3] = True
$aTest[3][3] = True
$aTest[4][3] = False
$aTest[5][3] = True

$i = 0

While 1
    If ValidArray($aTest) Then
        ExitLoop
    EndIf  
    ConsoleWrite($i & @CRLF)
    $i += 1
    If $i >= 500 Then
        $aTest[4][3] = True
    EndIf  
Wend   

Func ValidArray(ByRef $aArray)
    If Not IsArray($aArray) Then
        Return -1
    EndIf  
    For $i = 1 To $aArray[0][0]
        If (Not $aArray[$i][3]) Then
            Return 0
        EndIf  
    Next
    Return 1
EndFunc
 
« Последнее редактирование: Май 01, 2012, 00:31:47 от Viktor1703 »



  Записан

running-frag [?]

  • Продвинутый
  • ***

  • Автор темы
  • Репутация: 57
  • Offline Offline
  • Сообщений: 440
  • why me?
    • Награды
Ну да, логика верна. Одно но, у нас $stClient не может быть изменён (в твоём случае это $aTest[5]). Т.е. это нужно создавать доп. массив, в который добавлять значения, а после искать в нём False.




  Записан

Viktor1703 [?]

Ну если массив $stClient не может быть изменён и если при запуске скрипта в любом элементе массива $stClient[$i][3] стоит False то какой смысл его проверять

Цитата
Нужно что бы мы вышли из цикла (While Not $_return) только тогда, когда все вызовы функции _window_checkLocation () отдали нам True. Если хотя бы один элемент отдал False - катаемся дальше по циклу.

Или я не правильно что - то понял :think:


Добавлено: Май 01, 2012, 00:37:30
Я понял что Вам нужно




  Записан

madmasles [?]

  • Глобальный модератор
  • *
  • *****
  • Репутация: 1839
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 4726
  • Версия AutoIt: 3.3.8.1
    • Награды
Viktor1703,
ИМХО, можно и без функции.
Код: AutoIt [Выделить]
Dim $aTest[5] = [1, 1, 1, 0, 1]
$i = 0

While 1
    $iCountFalse = 0
    For $j = 0 To UBound($aTest) - 1
        If $aTest[$j] Then ContinueLoop
        $iCountFalse += 1
    Next
    ConsoleWrite($i & @TAB & $iCountFalse & @LF)
    $i += 1
    If $i >= 50 Then
        $aTest[3] = True
    EndIf
    If Not $iCountFalse Then ExitLoop
    Sleep(10)
WEnd
« Последнее редактирование: Май 01, 2012, 00:44:37 от madmasles »



  Записан

running-frag [?]

  • Продвинутый
  • ***

  • Автор темы
  • Репутация: 57
  • Offline Offline
  • Сообщений: 440
  • why me?
    • Награды
Ну если так говоря то в массиве $stClient[$i][3] находится флаг, будем ли мы использывать данного чара (персонажа в игре, для бота). И я хочу делать проверки только по тем персонажам которые "включены" (имеют True значение). А всех остальных лесом...




  Записан

Viktor1703 [?]

Вы это имели ввиду?

Код: AutoIt [Выделить]
Func _window_checkAllClients ()
    Local $_result = True
    Local $_chr = 4
    Local $_len = 0
    Local $_sum = 0
   
    While $_result
        For $i = 1 To $_chr
            If $stClient[$i][3] Then
                $_len += 1
                _client_makeActive ($stClient[$i][1])
                If _window_checkLocation ($stClient[$i][2], True, True) Then
                    $_sum += 1
                EndIf  
            EndIf
        Next
        If $_len == $_sum Then
            ExitLoop
        EndIf  
        $_len = 0
        $_sum = 0
    WEnd    
   
    Return True
EndFunc
 
« Последнее редактирование: Май 01, 2012, 00:50:01 от Viktor1703 »



  Записан

running-frag [?]

  • Продвинутый
  • ***

  • Автор темы
  • Репутация: 57
  • Offline Offline
  • Сообщений: 440
  • why me?
    • Награды
да, тольк вот тут не сработает цикл
Код: AutoIt [Выделить]
For $i = 1 To $_chr


в теории как то вот так получается (но скрипт не работает)

Код: AutoIt [Выделить]
Func _window_checkAllClients ()
    Local $_check
   
    While True
       
        For $i = 1 To 4
            If $stClient[$i][3] Then
               
                _ArrayAdd ($_check, _window_checkLocation ($stClient[$i][2], True, True))
            EndIf
        Next
       
        ;_ArrayDisplay ($_check)
       
        If Not (_ArraySearch ($_check, False)) Then ExitLoop ; если нету False
           
        $_check = "" ; затираем массив
    WEnd   
   
    Return True
EndFunc
 




  Записан

Viktor1703 [?]

Я уже исправил

madmasles, да, но с функцией для меня удобнее  :)




  Записан

running-frag [?]

  • Продвинутый
  • ***

  • Автор темы
  • Репутация: 57
  • Offline Offline
  • Сообщений: 440
  • why me?
    • Награды
увидел, но всё равно это будет работать только если мы знаем значение $_chr, а если нет?  :stars:

madmasles походу близок к правде, сейчас перепишу проверю (сразу не увидел)

нет, ошибся, там не такой принцеп что хочется




  Записан

Viktor1703 [?]

Вообще значение $_chr должно браться из размерности массива то есть $stClient[0][0]  :blink:

OffTopicхотя не знаю как вообще выглядит скрипт и откуда берётся это значение :stars:




  Записан

running-frag [?]

  • Продвинутый
  • ***

  • Автор темы
  • Репутация: 57
  • Offline Offline
  • Сообщений: 440
  • why me?
    • Награды
Массив генерится из GUI. По сути мы можем там иметь от 1 до 100. Вариант конечно с доп. функцией, что б сначало пробегать узнавать сколько чаров имеют "True" и отдавать это значение в $_chr. Тогда всё красиво. Или другой вариант довести до ума, тот что "сохранять результаты в массиве и после в них искать False" (посл. мой пример с _ArraySearch()).


Добавлено: Май 01, 2012, 01:18:27
ВО! Коряво но работает, вот что я хотел.
Код: AutoIt [Выделить]
Func _window_checkAllClients ()

    While True
        Dim $_check[1] = [0]
       
        For $i = 1 To 4
            If $stClient[$i][3] Then
                _ArrayAdd ($_check, _window_checkLocation ($stClient[$i][2], True, True))
            EndIf
        Next
       
        If _ArraySearch ($_check, False, 1) = -1 Then ExitLoop ; нету там False
       
    WEnd   
   
    Return True
EndFunc


И то как то не очень красиво, но данный выход работает правильно.


Добавлено: Май 01, 2012, 01:23:02
Тема решена, спасибо всем кто приниман участвие. Ваши примеры натолкнули на мыслю. ;) Хотя всё же от "расчитать кол. активных персонажей" (те у которых True) не уйти :(
« Последнее редактирование: Май 01, 2012, 21:43:55 от running-frag, Причина: Объединение сообщений »



  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
[Массивы] Некоторые вопросы по массиву в том числе 2D
AutoIt для новичков
r35p3ct 3 1579 Последний ответ Ноябрь 05, 2009, 13:21:10
от Kaster
[Автоматизация] про выход из цикла по таймеру
Стол заказов
muzzy 6 4516 Последний ответ Ноябрь 06, 2009, 21:56:03
от Kaster
Как организовать выход из такого цикла?
AutoIt для новичков
Suppir 3 1530 Последний ответ Ноябрь 15, 2009, 15:01:16
от Suppir
Крах скрипта связанный с присвоением данных массиву через функцию
Баг-репорты и запросы на новые функции
VitAl2013 21 4969 Последний ответ Апрель 05, 2010, 20:16:51
от CreatoR
[Элементы GUI] Выход из цикла
AutoIt для новичков
xamd 5 1942 Последний ответ Апрель 05, 2010, 20:26:06
от xamd
Выход и прерывание цикла по таймеру
AutoIt для новичков
kermzy 5 2507 Последний ответ Февраль 08, 2012, 12:50:00
от madmasles
выход из цикла при появлении пикселя
AutoIt для новичков
stormovik 7 986 Последний ответ Октябрь 11, 2011, 23:20:53
от Kaster
Do...Until завершение этого цикла после нажатия левлй кнопки мыши?
AutoIt для новичков
agikon 2 1094 Последний ответ Октябрь 24, 2011, 01:08:59
от agikon
Выполнение разных действия в одном условии, после его проверки!
AutoIt для новичков
LightDemon 4 961 Последний ответ Ноябрь 27, 2011, 01:03:08
от LightDemon
Выход из цикла при выборе меню в трее
GUI - Графический интерфейс пользователя
Vini 3 679 Последний ответ Май 10, 2012, 15:24:31
от CreatoR


Реклама


* Пользователи онлайн
  • Dot Гостей: 64
  • Dot Скрыт: 0
  • Dot Пользователей: 13
  • Dot Пользователи Online: