Author Topic: Как сравнить переменную со всеми элементами массива?  (Read 6852 times)

0 Members and 2 Guests are viewing this topic.

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Приветствую, подскажите пожалуйста новичку. Есть задача сравнить определенную переменную со всеми элементами массива, и если найдется совпадение, сделать определенное действие. И еще один вопрос, можно ли очищать массив, а то я считываю элементы с txt файла, и с каждым циклом программы, к предыдущим элементам добавляются новые, а хотелось бы чтобы, каждый цикл создавался новый массив. Заранее благодарен.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Или так
Code: (clickermann) [Select]
$per = "слово"

TFREADARR("file.txt", $arr) // считываем файл в массив
$v_massive = ARRSIZE($arr)       // $v_massive = число элементов в массиве
FOR($a=0,$a<$v_massive)         // цикл извлечение элементов массива
   $s = $arr[$a] // считываем эдементы по порядку
   IF($per = $s)    //  сравниваем
      // вставить сюда определённое действие
      LOGWRITE ("Совпадение  ",$per," = ",$sravni)
      $a = $v_massive // прерываем цикл
   END_IF
END_CYC
UNDEFINE($arr) // очищаем массив на случай если не требуется перебирать всё

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Спасибо всем огромное, очень мне помогли!

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
У меня еще вопрос появился.  Когда в массиве около 50 строк, программа, начинает подтормаживать, и наступает момент, когда вообще останавливается. Перезапуск помогает, но после 20-30 циклов скрипта опять тормозит и останавливается. (то есть перезапуск не означает, что массив пустой стал, он сразу же из файла наполняется до прежнего вида) Получается, что если в массиве много элементов, цикл работает некорректно. В чем может быть проблема? Для clickermanna 50 элементов в массиве - это много?

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
дело не в цикле, а в символах ваших строк, можете проверить скармливая кусками всего по 5 строк, спотыкаться будет именно на нечитаемых символах одних и тех же строк независимо от размера массива.
Но у меня в массиве числа (например такие 50067651), никаких символов, кириллицы и прочего нет, или я что-то не правильно понял?

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
сценарий в студию

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Суть этого сценария заключается в том, что он на страницах типа этой https://vk.com/wall-36231266?offset=20 ищет ссылки на группы ВК и открывает их на новой вкладке, а дальше вступает в группу и т.д. Это только часть сценария (только открываем новую вкладку, в группу не вступает и дальнейшие действия не делает), именно в этой части проблема. Тот момент, о котором я спрашивал нужен для того, чтобы не открывались одни и те же группы по нескольку раз, так как там публикуют свою рекламу по много раз. То есть смотрим на миниатюру, считаем сумму пикселов, если такое уже открывали (такая сумма пикселов уже встречалась), пропускаем. Если смотреть на лог во время работы программы, видно, что цикл бывает крутится либо несколько раз, либо бывает бесконечно (именно в этот момент кажется, что программа остановилась)


Code: (clickermann) [Select]
$numb_click=WNDFIND ("Clickermann")  // определяем номер окна кликера
waitms(10)
SETKBLAYOUT ($numb_click, 1049)     // устанавливаем русский для кликера
waitms(100)
$numb_okn=WNDFIND ("google chrome")  // определяем номер окна Хрома
waitms(50)
WNDSIZE ($numb_okn, 1380, 742)      //устанавливаем размер окна Хрома
waitms(100)
HSET ($numb_okn, 1)   // привязываемся к Хрому
waitms(50)

start:
//прокручиваем страницу вниз
LCLICK(1156,329) // кликаем в пустое место страницы
keypress(#down)
waitms(10)
keypress(#down)
waitms(100)
GETSCREEN
IF_PICTURE_IN (415,85, 480,260, "line.bmp",-1,90)  //ищем отделяющую линию
   //записывем координаты
   $x1=$_return1
   waitms(10)
   $y1=$_return2
   WAITMS(100)
else
   goto(start)   //если не нашли, возвращаемся
END_IF
waitms(50)
GETSCREEN
IF_PICTURE_IN ($x1+10,$y1+10, 1130,730, "like.bmp", -1, 90) //ищем лайк
   //записывем координаты
   $x2=$_return1
   waitms(10)
   $y2=$_return2
   WAITMS(100)
END_IF
waitms(100)

GETSCREEN
$count1 = PXLCRC ($x1,$y1+12, $x1+10, $y1+20)  // считаем сумму пикселов в миниатюре под отделяющей линией
waitms(10)

TFREADARR ("file_mass.txt", $arr)   // считываем из текстового файла все предыдущие суммы пикселов и помещаем их в массив
waitms(100)


$v_massive= ARRSIZE($arr)     // $v_massive = число элементов в массиве
FOR($a=0,$a<$v_massive)      // цикл извлечение элементов массива
   waitms(10)
   $sravni=INT(ARRPOP($arr))
print($sravni)     // извлекается и преобразуется в число последний элемент массива ( массив уменьшается на 1 элемент)
   waitms(20)
   IF($count1 = $sravni)    //  сравниваем
      goto(start)           // если видим совпадение, идем в начало
   END_IF
END_CYC
waitms(10)
UNDEFINE($arr)  // очищаем массив

waitms(100)

GETSCREEN
IF_picture_IN($x1,$y1, $x2,$y2, "vk.bmp")   //ищем ссылку вконтакта
   waitms(100)
   mclick($_return1+1,$_return2+1)      // если нашли ее, открываем на фоновой вкладке
   WAITMS(500)
   
   LCLICK(300,30)    // кликаем на открытую вкладку
   
   waitms(10)
   TFWRITE("file_mass.txt", $control)     //записываем в массив сумму пикселов миниатюрки аватара человека, разместившего ссылку
else
   goto(start)  // идем в начало, если не нашли ссылку
end_if

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Суть этого сценария заключается в том, что он на страницах типа этой https://vk.com/wall-36231266?offset=20 ищет ссылки на группы ВК и открывает их на новой вкладке, а дальше вступает в группу и т.д. Это только часть сценария (только открываем новую вкладку, в группу не вступает и дальнейшие действия не делает), именно в этой части проблема. Тот момент, о котором я спрашивал нужен для того, чтобы не открывались одни и те же группы по нескольку раз, так как там публикуют свою рекламу по много раз. То есть смотрим на миниатюру, считаем сумму пикселов, если такое уже открывали (такая сумма пикселов уже встречалась), пропускаем. Если смотреть на лог во время работы программы, видно, что цикл бывает крутится либо несколько раз, либо бывает бесконечно (именно в этот момент кажется, что программа остановилась)


Code: (clickermann) [Select]
$numb_click=WNDFIND ("Clickermann")  // определяем номер окна кликера
waitms(10)
SETKBLAYOUT ($numb_click, 1049)     // устанавливаем русский для кликера
waitms(100)
$numb_okn=WNDFIND ("google chrome")  // определяем номер окна Хрома
waitms(50)
WNDSIZE ($numb_okn, 1380, 742)      //устанавливаем размер окна Хрома
waitms(100)
HSET ($numb_okn, 1)   // привязываемся к Хрому
waitms(50)

start:
//прокручиваем страницу вниз
LCLICK(1156,329) // кликаем в пустое место страницы
keypress(#down)
waitms(10)
keypress(#down)
waitms(100)
GETSCREEN
IF_PICTURE_IN (415,85, 480,260, "line.bmp",-1,90)  //ищем отделяющую линию
   //записывем координаты
   $x1=$_return1
   waitms(10)
   $y1=$_return2
   WAITMS(100)
else
   goto(start)   //если не нашли, возвращаемся
END_IF
waitms(50)
GETSCREEN
IF_PICTURE_IN ($x1+10,$y1+10, 1130,730, "like.bmp", -1, 90) //ищем лайк
   //записывем координаты
   $x2=$_return1
   waitms(10)
   $y2=$_return2
   WAITMS(100)
END_IF
waitms(100)

GETSCREEN
$count1 = PXLCRC ($x1,$y1+12, $x1+10, $y1+20)  // считаем сумму пикселов в миниатюре под отделяющей линией
waitms(10)

TFREADARR ("file_mass.txt", $arr)   // считываем из текстового файла все предыдущие суммы пикселов и помещаем их в массив
waitms(100)


$v_massive= ARRSIZE($arr)     // $v_massive = число элементов в массиве
FOR($a=0,$a<$v_massive)      // цикл извлечение элементов массива
   waitms(10)
   $sravni=INT(ARRPOP($arr))
print($sravni)     // извлекается и преобразуется в число последний элемент массива ( массив уменьшается на 1 элемент)
   waitms(20)
   IF($count1 = $sravni)    //  сравниваем
      goto(start)           // если видим совпадение, идем в начало
   END_IF
END_CYC
waitms(10)
UNDEFINE($arr)  // очищаем массив

waitms(100)

GETSCREEN
IF_picture_IN($x1,$y1, $x2,$y2, "vk.bmp")   //ищем ссылку вконтакта
   waitms(100)
   mclick($_return1+1,$_return2+1)      // если нашли ее, открываем на фоновой вкладке
   WAITMS(500)
   
   LCLICK(300,30)    // кликаем на открытую вкладку
   
   waitms(10)
   TFWRITE("file_mass.txt", $control)     //записываем в массив сумму пикселов миниатюрки аватара человека, разместившего ссылку
else
   goto(start)  // идем в начало, если не нашли ссылку
end_if
P.S. Ошибся, когда редактировал текст для того, чтобы опубликовать тут. В 72 строке вместо $control должен быть $count1

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Code: (clickermann) [Select]
   IF($count1 = $sravni)    //  сравниваем
      goto(start)           // если видим совпадение, идем в начало
   END_IF
Ты выпрыгиваешь из цикла (что не очень хорошо), при этом не обнуляя массив, но если цикл завершится сам то обнулять уже будет нечего, ведь ARRPOP извлекает и удаляет последний элемент массива. Также в этом цикле не нужны задержки, лишние тормоза.

Разумнее всего каким либо образом предварительно сграбить все ссылки, обработать их удалив дубликаты (например в Akel Pad есть такие инструменты) и уж потом гонять по страницам.

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Code: (clickermann) [Select]
   IF($count1 = $sravni)    //  сравниваем
      goto(start)           // если видим совпадение, идем в начало
   END_IF
Ты выпрыгиваешь из цикла (что не очень хорошо), при этом не обнуляя массив, но если цикл завершится сам то обнулять уже будет нечего, ведь ARRPOP извлекает и удаляет последний элемент массива. Также в этом цикле не нужны задержки, лишние тормоза.

Разумнее всего каким либо образом предварительно сграбить все ссылки, обработать их удалив дубликаты (например в Akel Pad есть такие инструменты) и уж потом гонять по страницам.
спасибо за ответ, сам только что нашел. И за совет тоже спасибо!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Действовал похожим образом храня контрольные суммы аватарок в массиве и файле.
Всё что подсказал Андрей правильно. Ещё хотелось бы добавить, зачем ты каждый раз считываешь массив из файла?
Читать нужно один раз в начале. При сравнении доставать элементы не ARRPOP, а по индексу $arr[$a].
Массив не очищать а по необходимости только добавлять, попутно дописывая в файл.

Зачем лишние задержки после каждого присваивания? Там они ни к чему. стр 23,25,29,34,36,38,42,50,53,58,61,65
А вот здесь они маленькие 16,71 и особенно 18
Зачем лишние GETSCREEN если не происходило никаких изменений на экране? стр 30, 40

print в цикле стр.52 тоже плохая идея. принт выполняется очень медленно. И в цикле его стоит оставлять только во время отладки.
Полезнее было 49 строкой поставить print($v_massive) тогда бы увидел свою преведущую ошибку приводящую к сильному, ненужному росту размера массива.


r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Спасибо, я все учту, особенно, что касается задержек и getscreen. В цикле ставил задержки, и Print тоже, чтобы отследить, что творится вообще, а потом также ставил и print($v_massive), после чего понял свою ошибку. Что касается остальных задержек, то читал, что нужно их ставить, чтобы не нагружать процессор, возможно что-то не правильно понял. То есть их нужно ставить после каких-то нажатий клавиатуры и мыши, в остальных случаях не нужно? Какие они должны быть?

r-thomas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Если быть проще  и пофиг рейтинг, то можно написать скрипт сортирующий строки по мере возрастания контрольных сумм и маску сравнивающую не контрольные суммы полностью, а их цифры последовательно, сначала должны совпасть первые, затем вторые и т.д.  Это ускорит поиск в много тысяч раз. Учитывая, что поиск может быть ежедневным, а количество груп в текстовом документе огромным это лишним не будет.
Вариант с рейтингом думаю, что мне не подойдет, а вот это интересно, сейчас подумаю, как реализовать

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Тут насчёт этого начинают бодаться. У каждого своё мнение.
Я, по опыту определил для себя.
Ставлю задержки после кликов, нажатий кнопок, работой с буфером, работой с файлами.

Например, был у меня скрипт, менял задержки в других скриптах (запись). Т.е. он часто читал-писал строки в цикле. Без задержек хватало только на ~50-70 записей, потом начинало пропускать. После добавления задержки всё устаканилось и пара-тройка тысяч строк нормально обработалось.

Не ставлю задержки если идут просто вычисления, условия.
В ожидающих циклах, при холостом ходе задержка обязательна. Хотя бы маленькая 10-50 мс

Ну и от компа ещё зависит.