Массивы
Описание
Самый простой способ понять массивы - это рассматривать их как набор одноименных переменных с номером. Что-то вроде:
#значение1 #значение2 #значение3 #значение4 #значение5
Тот же самый набор некоторых значений. Разница лишь в записи. А это в виде массива:
%arr [ 1 ] %arr [ 2 ] %arr [ 3 ] %arr [ 4 ] %arr [ 5 ]
Весь смысл в том, что эти цифры в массивах можно задать переменной. Вот тебе и все массивы. Т.е.:
set #a 1 set #b 2 set #c 3 set #d 4 set #e 5 %arr [ #a ] %arr [ #b ] %arr [ #c ] %arr [ #d ] %arr [ #e ]
В итоге опять имеем тот же набор некоторых значений, все с теми же индексами от 1 до 5. Для нас это все те же 5 значений, как и в 1 записи, только номера этих переменных мы задали уже переменными.
set #i 1 %arr [ #i ] set #i #i + 1 // получилось i = 2 %arr [ #i ] set #i #i + 1 // получилось i = 3 %arr [ #i ] set #i #i + 1 // получилось i = 4 %arr [ #i ] set #i #i + 1 // получилось i = 5 %arr [ #i ]
В этой записи мы создаем переменную #i равной 1, затем используем ее при обращении к массиву. После каждого обращения к массиву мы увеличиваем значение переменной на 1 (set #i #i + 1). Таким образом, не смотря на то, что мы постоянно обращаемся к %arr [ #i ], каждый раз обращение происходит к следующему элементу, т.к. #i у нас увеличивается на 1. <br>Чтобы не писать такие однотипные строки, можно использовать оператор for. Весь смысл этого оператора- выполнять код циклами, увеличивая(или уменьшая) указанную переменную-счётчик.
for #i 1 5 1
<br>#i - изменяемая переменная ("счётчик") <br>1 (первая в записи) - начальное значение <br>5 - конечное значение (при его превышении цикл прервется) <br>1 (вторая в записи) - число которое будет каждый раз прибавляться. <br><br>Проще говоря запись означает, создать переменную #i равной 1 и прибавлять 1, пока #i не станет больше 5. В нашем примере это выглядело бы так:
for #i 1 5 1 %arr [ #i ] end_for
Мы обратились пять раз к массиву, это были элементы:
%arr [ 1 ] %arr [ 2 ] %arr [ 3 ] %arr [ 4 ] %arr [ 5 ]
<br>Собственно если понять смысл данного поста, то 90% возможностей массивов вы сможете использовать. <br><br>Если не всё понятно, то ещё небольшое описание. По сути, массив - это таблица, в которой каждая ячейка имеет номер по горизонтали и вертикали, и в ней находятся какие-то данные. Допустим имеется массив 3*2 (3 строки и 2 столбца), с именем %arr:
// Это массив: set %arr [1 1] 100 // индексы [1 1] означают: первая строка, первый столбец set %arr [1 2] 200 // [1 2] - первая строка, второй столбец set %arr [2 1] 300 // вторая строка, первый столбец set %arr [2 2] 400 set %arr [3 1] 500 set %arr [3 2] 600 // третья строка, второй столбец // можно сохранить его, чтобы посмотреть как хранятся данные save_array %arr C:\SaveArray.txt End_script
Если открыть файл 'SaveArray.txt', то увидим: <br>100 200 <br>300 400 <br>500 600 <br>Чтобы обратиться к какому-то элементу массива нужно указать индексы (номер строки и столбца):
set %arr [1 1] 100 set %arr [1 2] 200 set %arr [2 1] 300 set %arr [2 2] 400 set %arr [3 1] 500 set %arr [3 2] 600 msg Первая строка, первый столбец: %arr [1 1] msg Вторая строка, первый столбец: %arr [2 1] msg Третья строка, второй столбец: %arr [3 2] msg Индексы можно задавать переменными. set #a 2 msg Переменная "#a" равна #a msg Первая строка, второй столбец: %arr [1 #a] End_script
В основном массивы используют в циклах For.
set %arr [1 1] 100 set %arr [2 1] 200 set %arr [3 1] 300 set #size size(%arr) // присвоить переменной '#size' размер массива (количество строк), в данном случае будет присвоено 3. for #i 1 #size 1 // цикл, в котором переменная '#i' будет увеличиваться на единицу от 1 до 3 log Переменная "#i" равна #i log Содержимое элемента массива: %arr [#i 1] end_for End_script
Массив может быть одномерным, в нём только один столбец, т. е. указывается только номер строки. <br>И может быть двумерным, тогда нужно указывать номер строки и столбца.
Синтаксис
Привязка к окну: Нет. <br>Работа со свернутым окном: Да.
set <массив> [номер_строки] <значение>
Одномерный массив, где: <br><массив> - имя массива, может состоять из букв и цифр. Начинаться должно с '%' <br>[номер_строки] - номер строки массива. <br><значение> - значение элемента массива.
set <массив> [номер_строки номер_столбца] <значение>
Двумерный массив, где: <br><массив> - имя массива, может состоять из букв и цифр. Начинаться должно с '%' <br>[номер_строки номер_столбца] - номер строки и столбца массива. <br><значение> - значение элемента массива.
Примеры
// Пример 1 set %arr [1] 200 set %arr [2] 300 move %arr [1] %arr [2] // переместит курсор в координаты 200 300 End_script
// Пример 2 set %a [1] Вася set %a [2] Петя set %a [3] Маша set %a [4] Андрей set %a [5] Катя set #size size(%a) // размер массива (сколько в нём строк, в данном случае их 5) for #i 1 #size 1 // цикл, в котором переменная '#i' будет увеличиваться на единицу от 1 до 5 log Переменная "#i" равна #i // вывод в лог переменной '#i' log %a [#i] // вывод в лог значений массива, переменная '#i' указывает к какому элементу обращаться end_for End_script
// Пример 3 set %array [1 1] 111 set %array [1 2] 222 set %array [2 1] 333 set %array [2 2] 444 set %array [3 1] 555 set %array [3 2] 666 save_array %array C:\qwer4321.txt // сохранит массив на диске 'C:\' в файле 'qwer4321.txt' // можно посмотреть как хранятся данные в массиве for #i 1 size(%array) 1 move %array [#i 1] %array [#i 2] // переместит курсор по координатам из массива log %array [#i 1] %array [#i 2] // вывод в лог координат wait 1000 // ждать 1 секунду (1 секунда = 1000 мсек.) end_for End_script
// Пример 4 // Вывод в сообщение случайного элемента массива init_arr %array a b c d e f g h i j k set #a 1 + random(size(%array)) // получить псевдослучайное число от 1 до 11 (количество строк массива) msg %array [#a] // вывод в сообщение
Смотрите также
Init arr <br>Indexof <br>Load array <br>Save array <br>Sort array <br>Delete array
История развития
1.07 beta 5 <br>Добавил массивы. отныне символ процента '%' считается идентификатором массива. индексы массива указываются после имени в квадратных скобках '[' и ']'. размер массива равен максимальному использованному индексу. присваивание значений осуществляется каждому элементу индивидуально. элементы массива могут содержать как строки, так и числа. допустимо ссылаться на массивы параллельных скриптов, указав после имени массива, через точку, номер скрипта. при указании только первого индекса в двумерном массиве, результатом будет строка из всех элементов второй размерности массива, соответствующих указанному индексу, и разделенных пробелом
set %ar [4] тест // одномерный массив на 4 элемента set %arr [50 1] 544 set %arr [50 2] 800 // двумерный массив на 50 раз по 2 элемента set %ar.2 [5] // одномерный массив в параллельном скрипте left %arr [50] // клик левой кнопкой по координатам 544 800
1.07 beta 7 <br>Исправил ошибку присваивания элементам массива значений переменных.
2.02 <br>Исправил ошибку с присваиванием значений всегда только последнему элементу массивов, независимо от указанного. <br>Исправил ошибку с присваиванием значений массивам скрипта с номером 0, из других скриптов.
2.05 <br>Добавил переменную delimiter, используется для разделения элементов массива:
set %a [1 1] 1 set %a [1 2] 2 set delimiter '+' msg %a [1] set #n %a [1] msg #n set delimiter set #n %a [1] msg #n
2.17 <br>Добавил функцию 'size', возвращает длину указанного параметра пример:
set %q [4 3] test string here set %q [7 5] 0 set $q 123 + 8645 set #q 12 msg size (%q [ 4 3 ] ) // 16 - длина элемента массива msg size (%q [ 4 ] ) // 5 - вторая размерность массива msg size (%q ) // 7 - первая размерность массива msg size ($q) // 10 - длина строки msg size (#q) // 2 - количество разрядов msg size ( another test string ) // 19 - длина строки
2.19 <br>Исправил эксепшен при попытке записи пустого массива. <br>Массивы загружаются оттуда же, откуда и скрипты, если не указано иное. <br>Исправил ошибку с зарузкой массива (в результате чего оно дописывалось в конец существующего массива и он увеличивался с каждой загрузкой). <br>Исправил ошибку присвоения элементам массива значаний похожих на вычисляемые, например '-', выскакивал эксепшен. <br>Поправил неправильную запись массивов. игнорировалось указанное количество столбцов.
2.20 <br>Добавил задание размера массива. если массив не существовал, то он создается. если необязательные параметры отсутствуют, то принимаются равными нулю. 'set size (%arr <x> <y>)'.
2.21 <br>Научил условные операторы понимать элементы массива в качестве параметров. указание индексов массива элементами массива не поддерживается. <br>Научил условные операторы принимать элеменнты массива в качестве параметров для определения цвета точки. Пример:
set %a[1] 110 120 8030463 set %a[2] 110 120 set %a[5 1] 110, set %a[5 2] 120, set %a[5 3] 8030463 if (%a[1]) and (%a[2] 8030463) and %a[5]
2.24.1 <br>Добавил конструкции:
set %b [2] %a [2] // присваивание второму элементу массива B, всех элементов второй строки массива А (оно и раньше работало) set %b %a [2] // создание одномерного массива В из второй строки массива А set %b %a // создание массива В из массива А (копирование)
2.28 <br>Добавил возможность передавать в подпрограммы массивы. следите за соответствием типов переменных передаем массив по ссылке. т.е. изменение его в процедуре может привести к изменению в родительском скрипте. но если в процедуре изменится его размерность, то теоретически после этого изменения произойдет передача по значению (копирование).
set %var [1 1] abc set %var [1 2] 123 set #e 1 set delimiter '_' call test2 %var [1 2] %var [#e] %var %var.5 end_script proc test2 #v1 $v2 %v3 %v4 set delimiter '^' set logging Dump: #v1 $v2 %v3 [1] %v4 [1] // Dump: 123 abc_123 abc^123 abc^123 end_proc
2.30 <br>Если в качестве приемника в команде 'findwindow' указан массив, то записываем в него хендлы и имена ВСЕХ окон, в заголовке которых содержится указанная строка, или процессов, полностью совпадающих с указанным. Регистрозависимо.
set %arr FindWindow (World of Warcraft)
Добавил команду присваивания нескольких элементов массива одной строкой 'init_arr <массив> [(номер_строки [число_столбцов [начальный_столбец]])] <набор_значений>'. разделителями слов считаются те же символы, что и в остальных командах. исходный массив не удаляется. отсутствующие параметры по-умолчанию принимаются равными '1'.
init_arr %a 11 32 43 46 // одномерный массив, 4 эл-та (элементы [1] [2] [3] [4]) init_arr %a (2) 13 24 35 // во 2-ю строку пишем в 3 столбца, начиная с 1-го (элементы [2, 1] [2, 2] [2, 3]) init_arr %a (3, 2) 5 6 7 8 // в 3-ю строку пишем в 2 столбца, начиная с 1-го (получится 2 строки, элементы [3, 1] [3, 2] [4, 1] [4, 2]) init_arr %a (3, 2, 7) 5 6 7 8 // в 3-ю строку пишем в 2 столбца, начиная с 7-го (получится 2 строки, элементы [3, 7] [3, 8] [4, 7] [4, 8]
Добавил поиск строки в массиве. по-умолчанию ищет точное совпадение, регистронезависимо. 'set %result indexOf ( %arr [noabs] [case] [[startRow [EndRow]] count] (text) )'.
параметры: noabs - если указано, то ищем подстроку, иначе абсолютное совпадение, кроме регистра case - если указано, то при сравнении учитывается регистр символов count - максимальное число найденых элементов. если > 0, то ищем в направлении "с начала", если < 0, то ищем в направлении "с конца". если не указан, то ищем "все". этот параметр имеет приоритет в порядке распознавания, над начальной и конечной позицией поиска.
ищет по столбцам. возвращает адреса найденных элементов в формате 'строка|столбец/'. пример: '3|7/3|8/4|7/4|8/'. его хорошо понимает команда 'set' для присваивания элементов массива пачкой. если ничего не найдено, то вернет пустую строку. если в качестве приемника указана целая переменная ('set #e indexOf...'), то возвращаем номер только одной строки. причем 'count' указывает какое по порядку вхождение нужно искать. если элемент с указанным номером не найден, то результат -1.
примеры: set #a indexOf ( %arr case -1 (Test) ) // ищет номер последнего элемента массива %arr, имеюшего значение в точности равное Test (с учетом регистра) set #b indexOf ( %arr (12) ) // ищет номер первого элемента массива %arr, имеюшего значение в точности равное 12 set #c indexOf ( %arr noabs 3 (admin) ) // ищет номер третьего элемента массива %arr, содержащего подстроку 'admin' set %r indexOf ( %arr case 5 15 2 (Passed) ) // просматривает элементы массива %arr с пятой строки по пятнадцатую, и возвращает в массив %r адреса ячеек, содержащих первые два точных совпадения с искомой строкой set %r indexOf ( %a (14) ) // возвращает в массив %r адреса всех ячеек, сорвпадающих с указанной строкой
2.31 <br>Починил возврат массивов из процедур, при изменении в процедуре последней колонки или строки массива.
2.32 <br>Добавил в 'findimage' возврат конечных координат найденной картинки в третьем и четвертом элементе возвращаемого массива. <br>Добавил проверку на круглость скобок в команде 'init_arr'. Сообщение выводим, но выполнение не прерываем. <br>Исправил обязательное наличие пробела перед скобками в команде 'init_arr'. <br>Добавил функции разложения цвета:
colorToRed (color) - возвращает значение красного канала указанного цвета colorToGreen (color) - возвращает значение зеленого канала colorToBlue (color) - возвращает значение синего канала colorToRGB (color %arr) - разлаживает цвет на составляющие в первую строку указанного массива colorToRGB (color %arr[x]) - то-же, но в конкретную строку // %arr [ 1 1 ] R, %arr [ 1 2 ] G, %arr [ 1 3 ] B
Научил функцию 'minx' и 'maxx' искать минимум и соответственно максимум в массиве.
minx (%arr [1]) - возвращает минимальное значение конкретной строки массива minx (%arr) - возвращает минимальные значения всех столбцов массива в формате '1|2|3' (для присваивания массива пачкой), т.е. в первую строку нового массива.
То же самое про 'maxx', только наоборот. <br>Добавил вывод в скобках значения элемента массива после его имени, для команды 'set logging commands'.
2.31 <br>Научил 'findimage' понимать координаты, указанные элементами массива.
2.33 <br>Исправил поиск элемента во всем массиве в функциях 'minx' и 'maxx'.
2.36 <br>Добавил возврат найденного цвета в третьем элементе массива в команде 'findcolor'. <br>Добавил функцию, возвращающую адрес массива в памяти, и его размерность "set $s arrayaddress (%a) // $s = 12341578 1 1". Структура массива:
aDescr: shortstring ; aValue: array of array of string;
2.37 <br>Добавил возможность сортировки массивов 'sort_array %array [+col | -row] [dec]'. Положительное число задает сортировку по столбцам, отрицательное - по строкам.
2.39 <br>Добавил присваивание строке массива строки вида '3|7/3|8/4|7/4|8/'.