Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Учебные статьи => Topic started by: Johnny on October 08, 2013, 12:44:28 PM

Title: Массивы
Post by: Johnny on October 08, 2013, 12:44:28 PM
последняя редакция: 21.03.2014

Вводная часть

В версии 4.8 были введены массивы. Для начала классическое школьное определение. Массив (англ. Array) – это набор однотипных данных, расположенных в памяти друг за другом. При этом, благодаря этому «друг за другом», каждый элемент массива имеет свой порядковый номер (индекс, смещение). По сути, этот номер определяет смещение элемента массива в памяти относительно его (массива) начала, но вам не стоит вникать во все эти сложности, потому что как обычно, все нюансы «сложного программирования» Clickermann обрабатывает сам.

Итак массив, как и переменная, имеет собственное имя. Правила для имен массивов такие же как и для переменных. При этом, после указания имени массива, в квадратных скобках задается индекс элемента для получения его значения (или соотв. присвоения).

Рассмотрим пример

Code: (clickermann) [Select]
$arr[0] = 1
$arr[1] = 2
$arr[2] = 3
$arr[3] = 4
$arr[4] = 5

Здесь мы разместили в массиве $arr пять элементов. Обратите внимание что индексация массива начинается (как и в С++) с нуля.
Теперь, к примеру, если мы сделаем следующую операцию

Code: (clickermann) [Select]
Print( $arr[1] )
То в лог выведется «2». По аналогии с переменными, элементы массива могут становиться аргументами функций и процедур, участниками условий и вычислений. Вы можете спросить в чем же тогда удобство? Ну, например, вышеозначенный массив имеет пять элементов, которые мы могли бы заменить переменными $arr1($arr2, …). Тогда их вывод имел бы вид

Code: (clickermann) [Select]
Print($arr1)
Print($arr2)
Print($arr3)
Print($arr4)
Print($arr5)

Уже смотрится не очень. А если бы переменных было штук пятьдесят?
Однако в случае с массивом все намного проще. Мы просто прогоним весь массив в цикле

Code: (clickermann) [Select]
For($i, $i<5)
  Print( $arr[ $i ] )
End_cyc

Да, индексный параметр в квадратных скобках так же поддерживает вычисления и переменные, что существенно облегчает нам жизнь. Три строчки кода против пяти для нашего примера. И те же три строчки против пятидесяти были бы если бы у нас было, как я говорил, пятьдесят переменных.


Объявление и доступ

Что будет если выскочить за пределы массива? В том же С++ программа при работе выдала бы ошибку доступа к виртуальной памяти. Однако в нашем случае это просто вернуло бы «0» (не уверен, что всегда).

Массивы в Clickermann являются динамическими. Поскольку, как вы уже знаете, Clickermann лишен необходимости объявлять заранее переменные (и вообще что либо… хотя не гарантирую такую халяву в будущем… шов уже трещит), то это же правило распространяется и на массивы.

Вы можете например задать массив на семь элементов таким образом

Code: (clickermann) [Select]
$arr[6] = 5
При этом элементы массива 0,1,2,3,4,5 будут содержать т.н. мусор, то есть данные, лежащие в оперативной памяти до выполнения нашего кода. Это происходит потому что память массиву присваивается, но никакие значения в нее пока не кладутся и там хранится старая мусорная информация. Данный массив так же можно растянуть еще до десяти элементов

Code: (clickermann) [Select]
$arr[8] = 32
$arr[9] = 43

Однако это работает только в одну сторону. Чтобы обрезать массив потребуется вызвать спец функции. Поговорим о них.

Функции работы с массивом

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

Функция arrsize($arr)

Поскольку массивы могут легко менять размер, то данная функция необходима. Вызвав ее, мы получим количество элементов в массиве. Крайне простой пример.

Code: (clickermann) [Select]
$arr[0] = 12
$arr[5] = 123

Print( arrsize($arr) ) // вернет «6»

К слову сказать, если размерность массива 1, то это по сути переменная. И с ним можно работать как с переменной (запись «$arr[0]» в данном случае будет эквивалента «$arr»)

Процедура arrpush($arr, value)

Данная процедура добавляет новый элемент в конец массива. Каждый ее вызов соответственно увеличивает размер массива на 1. Вот пример

Code: (clickermann) [Select]
Arrpush($arr, 1)
Arrpush($arr, 2)
Arrpush($arr, 3)

Print( $arr[1] ) // вернет «2»
Print( arrsize($arr) ) // вернет «3»

Таким образом, можно особо и не возиться с индексами чтобы заполнить массив

Функция arrpop($arr)

Данная функция возвращает последний элемент массива, при этом удаляя его из массива, уменьшая, таким образом, его размерность на 1. Да, именно так можно обрезать (или целиком вообще вычистить) массив. Стоит понимать, что эта функция выдает элементы в обратном порядке (т.к. после удаления последним элементом становится предыдущий).

Code: (clickermann) [Select]
Arrpush($arr, 1)
Arrpush($arr, 2)

Print( arrpop($arr) ) // «2»
Print( arrpop($arr) ) // «1»

Но самое главное, что с помощью этих двух функций – arrpush и arrpop – можно без труда организовать самый натуральный стэк. Это тема отдельной беседы, потому что стэк (и регистры) фундаментальные понятия микропрограммирования. Нам же нужно помнить, что стэк, это стопка. Если положить то только сверху. Если взять, то только сверху. Если нужен предпоследний элемент, извольте сначала «снять с него» последний. Можете почитать Вики, если интересно, http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA

Процедуры scanpicture и scanpxl

Ну и наконец две самые вкусные функции, призванные, наконец, если не заменить, то дополнить два самых старейших костыля if_pixel_in и if_picture_in. Они конечно работают и на них построено огромное количество скриптов, однако у них есть один существенный недостаток – они находят только один элемент. Точнее первый. Например, как только наличие картинки на экране будет установлено, дальнейший анализ прекращается. Продвинутые пользователи конечно выходили из ситуации, играясь с координатами поиска, но это все не то (хотя безусловно полезно для общего развития).

Теперь разберем рассмотрим следующий скрипт

Code: (clickermann) [Select]
getscreen

scanpicture($var, 0,0, 1250,959, "pict.bmp")

while (arrsize($var) > 0)
  $y = arrpop($var)
  $x = arrpop($var)
  lclick($x, $y)
end_cyc

Этот короткий скрипт реализует очень большой геморрой. Он ищет в заданной области все экземпляры картинки pict.bmp и последовательно кликает на каждую из них. Разберем его по порядку. Прежде всего обратите внимание на новую процедуру scanpicture. Ее синтаксис схож с if_picture_in за тем исключением, что первым параметром идет массив. В этот массив процедура последовательно добавляет (через внутренний вызов arrpush) координаты каждого найденного экземпляра искомого изображения. Таким образом после выполнения scanpicture, входной массив $var будет содержать N пар координат x,y, где N количество найденных картинок.

Полученный массив можно представить схематически так:
[x1, y1, x2, y2, … , xN, yN] где x,y – пара координат

Далее необходимо всю эту кучу пробежать. Удобнее всего, как известно, перебирать массивы в цикле. Организуем цикл while с условием arrsize($var) > 0. Это будет оптимально по тому что позволит сразу проскочить тело цикла, если ничего не найдено. Стоит заметить что arrsize вернет значение N * 2, потому что эта функция возвращает длину массива и ее не волнует наше представление данных (в данном случае имеется ввиду что i – это координата X, i+1 – координата Y).
Далее мы в теле цикла вызываем arrpop($var) таким образом выдергивая последнюю координату Y и уменьшая длину цикла на 1. Следующий вызов arrpop вернет уже координату X последней пары (про работу стэка я уже рассказывал выше, вот это типичный пример). Таким образом в координатах $x, $y у нас лежат координаты последней найденной картинки. А поскольку arrpop уже удалил эту пару из массива, то сейчас там в самом конце лежат уже координаты предыдущей картинки. Таким образом извлекаются все координаты найденных картинок. И когда будет извлечена последняя пара, arrsize вернет 0 и цикл закончится.

Как видите разжевывание механизма работы занимает намного больше места, чем сам короткий скрипт. К слову, данный скрипт кликает по картинкам в обратном порядке, потому что начинает извлечение с последней. Но вы можете организовать свой обход цикла слева направо, например через for и индексы. Тут уже полная свобода действия.

Scanpxl я рассматривать не буду, потому что он работает аналогичным образом, за тем исключением, что вместо имени файла картинки передается цвет искомого пикселя.

Стоит добавить, что массивы, как и переменные хранят свои значения. Поэтому последовательный вызов двух scanpicture (например) без извлечения элементов через arrpop приведет к тому что у вас будет двойная очередь координат. Поэтому если вам для работы необходим «чистый» массив, то не забывайте высвобождать память, путем вызова undefine($var). Тут все как для переменных.

Такие дела. Я как мог подробно разжевал основные моменты работы с массивами в общем и тонкости их использования непосредственно в Clickermann. Надеюсь что данный материал поможет вам легко и быстро освоить новые способы программирования.
Title: Re: Массивы
Post by: mmutant on October 12, 2013, 10:26:46 AM
Quote
удалось прикрутить массивы в незначительный ущерб имеющейся в 4.7 гибкости (да, да, да, старые скрипты могут слететь)
А можно подробней про "ущерб"?
Title: Re: Массивы
Post by: Oraven on October 12, 2013, 12:44:14 PM
Например, если переменная содержит "число", и в нее попытаться записать "строку" то выскочит ошибка. В 4.7 ошибок не было.

$a = 1
$a = "тест"
Title: Re: Массивы
Post by: Johnny on October 13, 2013, 09:05:10 AM
ключевой момент в том, какого типа значение присваивается первый раз.
если инициализировать строкой, то все будет работать как в 4.7
то есть наоборот

$a = "тест"
$a = 1
print($a + 2)

в принципе, кстати, этот момент я могу исправить и вернуть как было в 4.7. но на сей раз придется пожертвовать оперативной памятью :D
а вообще, если развивать проект дальше до уровня чего-то маломальски похожего на язык программирования, то придется отказаться от такой халявы и вводить жесткие типы данных. как минимум поделить на строковый и численный (его в свою очередь можно поделить на дробный и целочисленный). без этого мы лишаемся возможности более плотно взаимодействовать с системой.
Title: Re: Массивы
Post by: Johnny on October 13, 2013, 09:16:44 AM
ключевой момент в том, какого типа значение присваивается первый раз.
если инициализировать строкой, то все будет работать как в 4.7
то есть наоборот

$a = "тест"
$a = 1
print($a + 2)

в принципе, кстати, этот момент я могу исправить и вернуть как было в 4.7. но на сей раз придется пожертвовать оперативной памятью :D
а вообще, если развивать проект дальше до уровня чего-то маломальски похожего на язык программирования, то придется отказаться от такой халявы и вводить жесткие типы данных. как минимум поделить на строковый и численный (его в свою очередь можно поделить на дробный и целочисленный). без этого мы лишаемся возможности более плотно взаимодействовать с системой, в которой все типы данных четко регламентированы.
Title: Re: Массивы
Post by: ЦИТРИН on October 26, 2013, 01:22:41 AM
Спасибо за массивы)
Все отлично отрабатывается.
Весьма удобно.
Сокращает работу над скриптом в сложных задачах.
Title: Re: Массивы
Post by: ЦИТРИН on November 05, 2013, 05:17:18 PM
Есть вопросы.
Возникла задача  автоматизировать процесс  кликанья в метки "лайк"  по блогу.
На странице блога примерно  2-5 однотипных изображений лайков ("+").
Скрипт
Code: (clickermann) [Select]
WAITMS(500)
DEFINE($NUM2,0)
DEFINE($NUM1,0)
start:
GETSCREEN
WAITMS(500)
SCANPICTURE($ARR_SCAN,347,135,719,1037, "plus1.bmp", -1, 95)
$GGG = ARRSIZE($ARR_SCAN)
IF($GGG = 0) // если больше нет картинок  "+"
   WAITMS(500)
   LCLICK(1673,1003)
   INC($NUM,1)
   INC($NUM2,1)
   KEYPRESS(#pagedown ) // перелистываем страницу
   WAITMS(500)
   IF($NUM > 3) // если  нет картинок посл 3 сканов  страницы идем вверх и повторяем  скрипт
      LCLICK(1673,1003)
      WAITMS(500)
      KEYPRESS(#home)
      WAITMS(500)
      UNDEFINE($NUM) // обнуляем  NUM
      IF($NUM2 > 9) //если  нет картинок после 9 сканов  страницы завершаем  скрипт
         HALT
      END_IF
      goto( start)
   END_IF
END_IF
$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   LCLICK($X, $Y)   // перемещаем курсор
   WAITMS(400)
END_CYC
UNDEFINE($ARR_SCAN)
goto( start)
Так вот .  Команда    KEYPRESS(#pagedown ) // перелистываем страницу
дает двойное перелистывание  а не одиночное.
 Команды
Code: (clickermann) [Select]
....
IF($NUM2 > 9) //если  нет картинок после 9 сканов  страницы завершаем  скрипт
         HALT
      END_IF
      goto( start)
   END_IF
END_IF
....
вместо    goto( start)  приводят к открытию новой  чистой вкладки в браузере Хром.
 Что я неправильно  сделал?
Title: Re: Массивы
Post by: Johnny on November 05, 2013, 05:47:51 PM
сдается мне ты какую то функциональную клавишу зажал. это вовсе не про массивы...
Title: Re: Массивы
Post by: Vint on November 09, 2013, 08:43:07 PM
Тут наверняка не в клавишах дело.
 Что-то с подложкой сайта. Она меняется постоянно + картинки слегка полупрозрачными сделаны.
Сумма пикселей всегда разная.
 Простую задачу не могу решить
Есть поле.
На поле может быть до 100  разных картинок.
Расположены они  строго по рядам ( межрядное 40 пикселей)  и строкам( межстрочное тоже 40 ).
В каждом ряду  может  быть только по 20 картинок
Строк всего  может  быть только 5.
Нужно последовательно  тыцнуть примерно в центр  каждой картинки.
Условие простое--->  Если картинок 24,  то нужно нажать ровно 24 раза.
 Постоянные ошибки.
Наверно нужно без массива искать выход.
Помогите корифеи !)
Тебе нужно нажать только на яйца с определённым фоном?
Открыл. Никаких проблем нет. Подложка нигде не пролазит. Да, на яйца что-то влияет, думаю рендеринг, а на цветной фон яйца ничего. Цвет вообще чистый на определённом удалении от яйца, нужно проверять его там и кликать со смещением в центр.
Вот фотошопная палочка с допуском 0...

И да, ты прав массивы здесь нафиг не нужны. Нужен только PXL() и всё. Шаг стабильный, рамка не размазана. 2 вложенных цикла перебирающих вертикальный и горизонтальный шаг, внутри сравнение PXL() и действие. Всё.

Дополнение! Горизонтальный шаг 39, а не 40.
Title: Re: Массивы
Post by: Vint on November 09, 2013, 09:14:30 PM
Беда в том ,что яйца часто меняются на иные картинки.
Не угадаешь.
Тупо тыкать  попробовал, но там  и число меняется.
100 раз  все протыкивать  и соотносить  каждый скрипт ( примерно 5000 строк )  своей переменной?
Суммарный скрипт выйдет на 25 мегабайт)))
Наверно есть простое решение.
Заранее известно , что будет  допустим 36, или 95  картинок.
Я эту переменную получаю.
Как протыкать  36 или 95  раз , каждый раз, новую  картинку, в зависимости от этой переменной?
 PXL()  не получается.
Если честно... ничего не понял.

Тебе нужно тыкать на все подряд? На скрине всего 7 цветов фона. Других не бывает?
И давай тему массивы не замусоривать.
Title: Re: Массивы
Post by: Vint on November 19, 2013, 03:56:32 PM
При использовании ARRPUSH, странно слетают дробные числа.
Хотел округлить, но не тут то было. В версии 4.8 сломался ROUND с отрицательным параметром, не могу округлить числа.
Предполагаю это общая проблема.
HELP!

Code: (clickermann) [Select]
ARRPUSH($Arr_Cena, 1120.69)
ARRPUSH($Arr_Cena, 1269.25)
ARRPUSH($Arr_Cena, 1425.4)
ARRPUSH($Arr_Cena, 1563.7)
ARRPUSH($Arr_Cena, 1704.68)
ARRPUSH($Arr_Cena, 1855.03)
ARRPUSH($Arr_Cena, 2004.48)
ARRPUSH($Arr_Cena, 2307.41)
ARRPUSH($Arr_Cena, 2611.22)
ARRPUSH($Arr_Cena, 2977.94)

$i = 0
for ($i, $i<ARRSIZE($Arr_Cena))
   LOGWRITE (" ", ROUND($Arr_Cena[$i-1], -2))
end_cyc
HALT

16:57:01  1120.6900000000001
16:57:01  1269.25
16:57:01  1425.4000000000001
16:57:01  1563.7000000000001
16:57:01  1704.6800000000001
16:57:01  1855.03
16:57:01  2004.48
16:57:01  2307.4099999999999
16:57:01  2611.2199999999998
16:57:01  2977.9400000000001
Title: Re: Массивы
Post by: Torari on March 26, 2014, 11:56:23 AM
А можно положить один массив в другой массив? Если это сделать можно, то было бы здорово посмотреть на пару простых примеров. Для общего повышения образованности, так сказать. Создать массив№1, который лежит в массиве№2. Положить данные в массив№1, который в массиве№2. Взять данные или вывести данные в логи, которые лежат в массиве№1, который лежит в массиве№2.
Title: Re: Массивы
Post by: Oraven on March 26, 2014, 12:37:01 PM
А можно положить один массив в другой массив? Если это сделать можно, то было бы здорово посмотреть на пару простых примеров. Для общего повышения образованности, так сказать. Создать массив№1, который лежит в массиве№2. Положить данные в массив№1, который в массиве№2. Взять данные или вывести данные в логи, которые лежат в массиве№1, который лежит в массиве№2.

Шта  :o

В обычной переменной хранится одно значение или строка, а в массиве, как в таблице, много значений или строк в столбик. Каждая "строка" имеет свой номер от 0 и далее.
Title: Re: Массивы
Post by: Torari on March 26, 2014, 01:05:03 PM
Quote
а в массиве, как в таблице, много значений или строк в столбик.
Ну, а в любой таблице, в ячейку можно вставить другую таблицу =) можно в ворде поэкспериментировать  ;).

Такие массивы называются "массивы массивов" или "многомерные массивы". Как-то так или как-то по другому. Кажется в школе была тема про них или в вузе, не помню уже подробностей. В любом случае, если кликермэн это поддерживает, то мне нужны примеры синтаксиса... иначе, я сам не додумаюсь).
Title: Re: Массивы
Post by: Крис Тинка on March 26, 2014, 01:46:11 PM
В кликерманне линейные массивы. Можно сделать псевдо-многомерные массивы. Например псевдо-двумерный массив(таблица 100х100) ячейка 45х53
Code: (clickermann) [Select]
$a = 45
$b = 53
$var[100*$a + $b] = 254
print ($var[4553])
halt
Title: Re: Массивы
Post by: aden on March 26, 2014, 02:49:56 PM
[spoiler]
В кликерманне линейные массивы. Можно сделать псевдо-многомерные массивы. Например псевдо-двумерный массив(таблица 100х100) ячейка 45х53
Code: (clickermann) [Select]
$a = 45
$b = 53
$var[100*$a + $b] = 254
print ($var[4553])
halt

О бох мой какая женщина, родите мне сына!!!
[/spoiler]
Title: Re: Массивы
Post by: Vint on March 26, 2014, 03:57:30 PM
О бох мой какая женщина, родите мне сына!!!

В очередь!
Title: Re: Массивы
Post by: relic00 on July 11, 2014, 07:23:42 AM
А как передать массив в качестве параметра в процедуру?
Title: Re: Массивы
Post by: aden on July 11, 2014, 07:40:07 AM
А как передать массив в качестве параметра в процедуру?
ищите ответ в этой теме
http://crapware.aidf.org/forum/index.php?topic=1296.0
Title: Re: Массивы
Post by: Dampil on August 13, 2014, 03:31:32 PM
кстати, про явное объявление типа переменной в контексте доведения скриптового языка до языка программирования - идея неплохая, на мой взгляд. На данный момент, конечно, просто получается скрипт, но некоторые моменты удручают. Не в обиду автору, всё равно работа неслабая проделана. СПС "от сердца и почек" :D
Title: Re: Массивы
Post by: Vint on August 13, 2014, 04:18:32 PM
кстати, про явное объявление типа переменной в контексте доведения скриптового языка до языка программирования - идея неплохая, на мой взгляд. На данный момент, конечно, просто получается скрипт, но некоторые моменты удручают. Не в обиду автору, всё равно работа неслабая проделана. СПС "от сердца и почек" :D
"явное объявление типа переменной" и так было в версиях 4.с мелочью, от них отказались и сделали динамическую типизацию. Кликер всё-таки не C++ и так новичкам трудно.
Title: Re: Массивы
Post by: Dampil on September 13, 2014, 11:33:33 PM
"явное объявление типа переменной" и так было в версиях 4.с мелочью, от них отказались и сделали динамическую типизацию. Кликер всё-таки не C++ и так новичкам трудно.

"Согласные мы" :) Каждому - своё. Просто при некотором опыте С и иже с ним тоже достаточно сложно "вписаться" местами(см. мой пост "первый скрипт комом")
Как говорится, "в конце концов среди них же" просто выразил своё не претендующее на правоту мнение.
Да и в случае явного объявления придётся делать достаточно много функций преобразования между типами. Как бы то ни было, всё решит автор(не в обиду ни в коем случае) и наличие у него свободного времени
Title: Re: Массивы
Post by: Oraven on September 15, 2014, 11:48:53 PM
INT преобразует строки в числа.

Code: (clickermann) [Select]
ARRPUSH($arr, 4)

$a = INT(ARRPOP($arr))
$b = $a + 1
LOGWRITE ($b)

HALT
Title: Re: Массивы
Post by: AandD on September 19, 2014, 12:50:38 PM
А зачем строгая типизация данных?
Достаточно к цифре хранить ее тип, тогда имеем
struct Nuber{
unsigned char type;
void * ptr;
}
да есть некий оверхед по простым обектам, но зато отказываемся от типизации.
Если такая проблема может имеет смысл посмотреть  в сторону js, lua? И заняться расширением функционала?
Title: Re: Массивы
Post by: Aant on November 01, 2014, 11:53:37 PM
Стоит добавить, что массивы, как и переменные хранят свои значения. Поэтому последовательный вызов двух scanpicture (например) без извлечения элементов через arrpop приведет к тому что у вас будет двойная очередь координат. Поэтому если вам для работы необходим «чистый» массив, то не забывайте высвобождать память, путем вызова undifine($var). Тут все как для переменных.

Я негодуэ.  :(
Совершенно не очевидно, что функция будет добавлять элементы в конец массива, а не переопределять его. ИМХО такой важный нюанс здорово было бы пометить в справке изначально. Хотя бы фразой не "... выводит координаты найденных экземпляров в массив", а "... добавляет координаты найденных экземпляров в массив", это дало бы мне шанс.
Особенно порадовала опечатка здесь "undifine" вместо правильного "undefine".

P.S. В целом хочу сказать автору спасибо за программу, но недоработки в ней очень сильно затрудняют работу.
Title: Re: Массивы
Post by: UsefulCorpse on November 08, 2014, 06:53:12 PM
Могу, конечно, ошибиться, но arrpop похожу удаляет элемент массива только в том случае, если есть куда передать вытаскиваемый элемент, т.е. logwrite(arrpop($var)) удалит элемент, а arrpop($var) - нет, что заставило меня долгое время чесать репу)
Title: Re: Массивы
Post by: Johnny on November 09, 2014, 11:08:35 AM
Могу, конечно, ошибиться, но arrpop похожу удаляет элемент массива только в том случае, если есть куда передать вытаскиваемый элемент, т.е. logwrite(arrpop($var)) удалит элемент, а arrpop($var) - нет, что заставило меня долгое время чесать репу)

это стандартное поведение для всех функций
Title: Re: Массивы
Post by: Oraven on January 09, 2015, 01:13:39 PM
При правильном подходе такого не возникает.

Code: (clickermann) [Select]
FOR($a=0,$a<7) // создаем массив
   $arr[$a] = 0
END_CYC

$arr[6] = 5

FOR($a=0,$a<7)
   LOGWRITE ($arr[$a]) // смотрим что получилось
END_CYC

HALT

Обычно массивы создаются и читаются в цикле, а не так просто неожиданно записывается [6] = 5
Title: Re: Массивы
Post by: rulentus on March 18, 2015, 01:51:29 PM
А есть ли возможность поместить в массив ивенты, то биш клики по скажем 5 заданным координатам, а потом рандомно через RNDFROM их оттуда вынимать
Title: Re: Массивы
Post by: Oraven on March 18, 2015, 02:20:53 PM
А есть ли возможность поместить в массив ивенты, то биш клики по скажем 5 заданным координатам, а потом рандомно через RNDFROM их оттуда вынимать

Проще это написать так

Code: (clickermann) [Select]
$r = RND(1,5)
SWITCH($r)
CASE(1)
   LCLICK(100,100)
CASE(2)
   LCLICK(200,100)
CASE(3)
   LCLICK(300,100)
CASE(4)
   LCLICK(400,100)
CASE(5)
   LCLICK(500,100)
DEFAULT
END_SWITCH
WAITMS(100)
Title: Re: Массивы
Post by: rulentus on March 18, 2015, 02:36:32 PM
Блин. Точняк. Надо пробовать. Спасибо.
Title: Re: Массивы
Post by: Vint on March 18, 2015, 02:53:07 PM
Можешь и через массив. Так даже проще если координат много.
Code: (clickermann) [Select]
STRSEPARATE("100:110:200:210:300:310:400:410:500:510", ":", $arr)
$r = RND(0,ARRSIZE($arr)/2-1)
LCLICK($arr[$r*2], $arr[$r*2+1])
Title: Re: Массивы
Post by: Alex Li on January 27, 2016, 01:01:53 AM
А как можно создать копию массива?
Я пробовал $var2=$var, но копировало только одно значение из массива.
Title: Re: Массивы
Post by: Doda on January 27, 2016, 01:10:26 AM
так в справке все написано же) (c)Alex Li
чтобы обратиться к массиву, нужно вызывать   элемент по индексу.
у вас есть массив $var, из 5 элементов, если хотите скопировать  массив, в другой массив $ret (только смысл?)
через цикл
Code: (clickermann) [Select]
for($i=0,$i<arrsize($var))
arrpush($ret, $var[$i])
end_cyc
Title: Re: Массивы
Post by: Золотой on January 27, 2016, 01:11:13 AM
А как можно создать копию массива?
Я пробовал $var2=$var, но копировало только одно значение из массива.
Code: (clickermann) [Select]
// записывает массив в файл
TFWRITEARR("file.txt", $arr1)
//списывает массив  из файла
TFREADARR("file.txt", $arr2)
//удаляет файл
TFCLEAR("file.txt", 1)
Title: Re: Массивы
Post by: Alex Li on January 27, 2016, 09:31:00 PM
Quote
так в справке все написано же)

Надеялся на некий незадокументированный способ  ;)
А так действительно смысла нет - легче не arrpop' ом а просто считывать
Браm комара, Золотой спасибо!
Title: Re: Массивы
Post by: zanogu on September 19, 2016, 03:24:06 PM
Привет!
Подскажите как сделать сравнение переменной с каждым значением в массиве, если значение уникальное (в массиве нет такого) внести в этот же массив и т.д. Размерность массива 30

Заранее благодарю за ответ.
Title: Re: Массивы
Post by: Oraven on September 19, 2016, 04:18:47 PM
Привет!
Подскажите как сделать сравнение переменной с каждым значением в массиве, если значение уникальное (в массиве нет такого) внести в этот же массив и т.д. Размерность массива 30

Заранее благодарю за ответ.


Code: (clickermann) [Select]
ARRPUSH($arr, 1) // создаем массив $arr для примера
ARRPUSH($arr, 2)
ARRPUSH($arr, 3)

$c = 5 // переменная $c для сравнения с массивом

$check = 1 // флаг переключатель
FOR($a=0,($a<ARRSIZE($arr))&($check = 1)) // цикл сравнения
   IF($arr[$a] = $c)
      $check = 0 // если совпадение найдено, выключаем
   END_IF
END_CYC
IF($check = 1) // если совпадение не было найдено
   ARRPUSH($arr, $c) // добавляем значение в массив
END_IF
Title: Re: Массивы
Post by: SSJnix on September 17, 2017, 02:25:18 PM
// массив из трех элементов
$var[0] = 1
$var[1] = 2
$var[2] = 3

$result = 0 // накапливаемая сумма

// перебор через цикл элементов массива [0 .. 2]
for($i, $i < 3)
  $result = $result + $var[ $i-1 ]
end_cyc

// вывод суммы элементов
print( $result )

в справке массивов данный код выдает ошибку интерпретации строки $result = $result + $var[ $i-1 ]
Title: Re: Массивы
Post by: Oraven on September 17, 2017, 03:10:35 PM
Там просто старый пример, раньше цикл FOR работал иначе. Теперь -1 в $var[ $i-1 ] писать не надо.
Title: Re: Массивы
Post by: SSJnix on September 17, 2017, 03:32:15 PM
Спасибо за ответы
Title: Re: Массивы
Post by: PasqualeAcosta on December 01, 2019, 01:20:42 AM
Доброго времени суток! Создал массив по примеру описанному в шапке. Суть скрипта, нужно искать совпадения картинок и делать с ними определенные действия (удаляя координаты уже отработанных из массива). По факту фарм мобов в игре.
В итоге когда добавляю колормод во второй строке скрипкт выдает ошибку. Так же при нахождении нескольких картинок цикл не повторяется. В чем может быть проблема?

Code: [Select]
GETSCREEN (264,112,1030,646)
COLORMODE(7,264,112,1030,646)
WAITMS(300)
scanpicture ($var,264,112,1030,646,"textures\002.bmp", -1, 05)
WAITMS(300)
LOGWRITE (ARRSIZE($var))
while (arrsize($var) > 0)
   $y = arrpop($var)
   $x = arrpop($var)
   WAITMS(300)
   lclick($x+100, $y-30) // клик моба
   WAITMS(500)
   GETSCREEN (658,666,658,666)
   COLORMODE(4,658,666,658,666)
   IF(PXL(658,666)=3100575)
      WAITMS(500)
      GETSCREEN (619,105,625,117)
      COLORMODE(8,619,105,625,117)
      IF_PICTURE_IN (619,105,625,117, "textures\004.bmp", -1, 70)
         WAITMS(100)
         LOGWRITE ("S моб")
         LCLICK(457,525)  // выходим
      ELSE
         WAITMS(300)
         LOGWRITE ("бьем"," ",$x+100,", ",$y-30)
         LCLICK(658,666)  // 3100575  атака
         WAITMS(300)
         LCLICK(723,219)  // 3885367
         WAITMS(300)
         LCLICK(733,291)  // 9874874
         WAITMS(300)
         LCLICK(739,367)  // 2105376
         WAITMS(300)
         LCLICK(742,483)  // 2499878
         WAITMS(300)
         LCLICK(739,549)  // 2302499
         WAITMS(300)
         LCLICK(640,686) // в бой
         WAITMS(30000)
      END_IF
   ELSE
   END_IF
end_cyc

LOGWRITE ("херушки")

HALT



Title: Re: Массивы
Post by: Oraven on December 01, 2019, 08:29:32 AM
Что еще за 05? Число не может начинаться с нуля.

Code: (clickermann) [Select]
GETSCREEN (264,112,1030,646)
COLORMODE(7,264,112,1030,646)
scanpicture ($var,264,112,1030,646,"textures\002.bmp", -1, 5)
LOGWRITE (ARRSIZE($var))
while (arrsize($var) > 0)
   $y = arrpop($var)
   $x = arrpop($var)
   lclick($x+100, $y-30) // клик моба
   WAITMS(500)
   GETSCREEN (658,666,658,666)
   COLORMODE(4,658,666,658,666)
   IF(PXL(658,666)=3100575)
      GETSCREEN (619,105,625,117)
      COLORMODE(8,619,105,625,117)
      IF_PICTURE_IN (619,105,625,117, "textures\004.bmp", -1, 70)
         LOGWRITE ("S моб")
         LCLICK(457,525)  // выходим
         WAITMS(100)
      ELSE
         LOGWRITE ("бьем"," ",$x+100,", ",$y-30)
         LCLICK(658,666)  // 3100575  атака
         WAITMS(300)
         LCLICK(723,219)  // 3885367
         WAITMS(300)
         LCLICK(733,291)  // 9874874
         WAITMS(300)
         LCLICK(739,367)  // 2105376
         WAITMS(300)
         LCLICK(742,483)  // 2499878
         WAITMS(300)
         LCLICK(739,549)  // 2302499
         WAITMS(300)
         LCLICK(640,686) // в бой
         WAITMS(30000)
      END_IF 
   END_IF
end_cyc

LOGWRITE ("херушки")

HALT
Title: Re: Массивы
Post by: Graubart on December 01, 2019, 06:11:17 PM
Что еще за 05? Число не может начинаться с нуля.
Вполне может. Допускается перед значимым числом ставить любое количество нулей. Кроме того, перед десятичной точкой можно нуль вообще не ставить. Вот простая прога, доказывающая это:
Code: (clickermann) [Select]
$value_1=5
 $value_2=05
 $value_3=0005
 $value_4=0.5
 $value_5=000.5
 $value_6=.5
 $mes=STRCONCAT($value_1,"=5",CHAR(13),$value_2,"=05",CHAR(13),$value_3,"=0005",CHAR(13),$value_4,"=0.5",CHAR(13),$value_5,"=0000.5",CHAR(13),$value_6,"=.5")
 $mr=DIALOGBOX($mes,0)
   HALT
Ошибка скорее всего кроется в том, что неправильно указан путь к файлу 002.bmp.

Title: Re: Массивы
Post by: Космич on December 01, 2019, 08:22:30 PM
Это не доказывает, что параметр точности принимает что либо еще, кроме целочисленного значения от 1 до 100
Title: Re: Массивы
Post by: PasqualeAcosta on December 01, 2019, 08:35:05 PM
Что еще за 05? Число не может начинаться с нуля.
Число работает нормально, пробовал по разному. Как только добавляю строчку колормода выдает подобную ошибку.
Код для теста сократил. В общем беда какая то с массивами, версия кликера 4.13. Или что то не так делаю? Как в в данной ситуации колормод применить?

Code: [Select]
MOVE(100,100)
GETSCREEN (260,140,1015,646)
COLORMODE(7,260,140,1015,646)
scanpicture ($var,260,140,1015,646,"textures\red4.bmp",-1, 5)
LOGWRITE (ARRSIZE($var))
while (arrsize($var) > 0)
   
   $y = arrpop($var)
   $x = arrpop($var)
   LOGWRITE ($x," ",$y)
WAITMS(100)
end_cyc
UNDEFINE($var)
LOGSHOW (1, 700,300)

HALT
Title: Re: Массивы
Post by: Vint on December 02, 2019, 10:46:49 AM
При чём здесь вообще массивы.
Нет файла по пути "textures\red4.bmp" или он имеет неправильный формат.
Или при редактировании скрипта не нажата "применить".
Если файл есть, этот код никаких ошибок не выдаёт.
Title: Re: Массивы
Post by: dramster on December 02, 2019, 11:06:13 AM
А никто не подумал, что колдормод 7 сокращает цвета до восьми(вроде) цветов, а при точности в 5 процентов, с большой вероятностью каждый пиксель будет считаться за начало найденной картинки. Както не логично. Хотя ошибка изза этого появляться не должна.



А может массив имеет какоето ограничение по размеру? Ведь это примерно 389580 пар координат может найти (зависит от размера искомой картинки)  :D . Вообще кликер с таким кодом должен подвиснуть, но ошибку не выдавать, если с картинкой "textures\red4.bmp" конечно все в порядке.
Title: Re: Массивы
Post by: Vint on December 02, 2019, 05:52:55 PM
То, что 5% нерабочая величина, мы пока пропустим.
Вот прям скопировал скрипт - ошибки нет.