Массивы

Материал из UoPilot
Перейти к навигации Перейти к поиску

Описание

Самый простой способ понять массивы - это рассматривать их как набор одноименных переменных с номером. Что-то вроде:

#значение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.
Чтобы не писать такие однотипные строки, можно использовать оператор for. Весь смысл этого оператора- выполнять код циклами, увеличивая(или уменьшая) указанную переменную-счётчик.

for #i 1 5 1


#i - изменяемая переменная ("счётчик")
1 (первая в записи) - начальное значение
5 - конечное значение (при его превышении цикл прервется)
1 (вторая в записи) - число которое будет каждый раз прибавляться.

Проще говоря запись означает, создать переменную #i равной 1 и прибавлять 1, пока #i не станет больше 5. В нашем примере это выглядело бы так:

for #i 1 5 1
   %arr [ #i ]
end_for

Мы обратились пять раз к массиву, это были элементы:

%arr [ 1 ]
%arr [ 2 ]
%arr [ 3 ]
%arr [ 4 ]
%arr [ 5 ]


Собственно если понять смысл данного поста, то 90% возможностей массивов вы сможете использовать.

Если не всё понятно, то ещё небольшое описание. По сути, массив - это таблица, в которой каждая ячейка имеет номер по горизонтали и вертикали, и в ней находятся какие-то данные. Допустим имеется массив 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', то увидим:
100 200
300 400
500 600
Чтобы обратиться к какому-то элементу массива нужно указать индексы (номер строки и столбца):

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

Массив может быть одномерным, в нём только один столбец, т. е. указывается только номер строки.
И может быть двумерным, тогда нужно указывать номер строки и столбца.

Синтаксис

Привязка к окну: Нет.
Работа со свернутым окном: Да.

set <массив> [номер_строки] <значение>

Одномерный массив, где:
<массив> - имя массива, может состоять из букв и цифр. Начинаться должно с '%'
[номер_строки] - номер строки массива.
<значение> - значение элемента массива.

set <массив> [номер_строки номер_столбца] <значение>

Двумерный массив, где:
<массив> - имя массива, может состоять из букв и цифр. Начинаться должно с '%'
[номер_строки номер_столбца] - номер строки и столбца массива.
<значение> - значение элемента массива.

Примеры

// Пример 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
Indexof
Load array
Save array
Sort array
Delete array

История развития

1.07 beta 5
Добавил массивы. отныне символ процента '%' считается идентификатором массива. индексы массива указываются после имени в квадратных скобках '[' и ']'. размер массива равен максимальному использованному индексу. присваивание значений осуществляется каждому элементу индивидуально. элементы массива могут содержать как строки, так и числа. допустимо ссылаться на массивы параллельных скриптов, указав после имени массива, через точку, номер скрипта. при указании только первого индекса в двумерном массиве, результатом будет строка из всех элементов второй размерности массива, соответствующих указанному индексу, и разделенных пробелом

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
Исправил ошибку присваивания элементам массива значений переменных.

2.02
Исправил ошибку с присваиванием значений всегда только последнему элементу массивов, независимо от указанного.
Исправил ошибку с присваиванием значений массивам скрипта с номером 0, из других скриптов.

2.05
Добавил переменную 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
Добавил функцию '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
Исправил эксепшен при попытке записи пустого массива.
Массивы загружаются оттуда же, откуда и скрипты, если не указано иное.
Исправил ошибку с зарузкой массива (в результате чего оно дописывалось в конец существующего массива и он увеличивался с каждой загрузкой).
Исправил ошибку присвоения элементам массива значаний похожих на вычисляемые, например '-', выскакивал эксепшен.
Поправил неправильную запись массивов. игнорировалось указанное количество столбцов.

2.20
Добавил задание размера массива. если массив не существовал, то он создается. если необязательные параметры отсутствуют, то принимаются равными нулю. 'set size (%arr <x> <y>)'.

2.21
Научил условные операторы понимать элементы массива в качестве параметров. указание индексов массива элементами массива не поддерживается.
Научил условные операторы принимать элеменнты массива в качестве параметров для определения цвета точки. Пример:

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
Добавил конструкции:

set %b [2] %a [2] // присваивание второму элементу массива B, всех элементов второй строки массива А (оно и раньше работало)
set %b %a [2] // создание одномерного массива В из второй строки массива А
set %b %a // создание массива В из массива А (копирование)

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

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
Если в качестве приемника в команде '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
Починил возврат массивов из процедур, при изменении в процедуре последней колонки или строки массива.

2.32
Добавил в 'findimage' возврат конечных координат найденной картинки в третьем и четвертом элементе возвращаемого массива.
Добавил проверку на круглость скобок в команде 'init_arr'. Сообщение выводим, но выполнение не прерываем.
Исправил обязательное наличие пробела перед скобками в команде 'init_arr'.
Добавил функции разложения цвета:

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', только наоборот.
Добавил вывод в скобках значения элемента массива после его имени, для команды 'set logging commands'.

2.31
Научил 'findimage' понимать координаты, указанные элементами массива.

2.33
Исправил поиск элемента во всем массиве в функциях 'minx' и 'maxx'.

2.36
Добавил возврат найденного цвета в третьем элементе массива в команде 'findcolor'.
Добавил функцию, возвращающую адрес массива в памяти, и его размерность "set $s arrayaddress (%a) // $s = 12341578 1 1". Структура массива:

aDescr: shortstring ;
aValue: array of array of string;

2.37
Добавил возможность сортировки массивов 'sort_array %array [+col | -row] [dec]'. Положительное число задает сортировку по столбцам, отрицательное - по строкам.

2.39
Добавил присваивание строке массива строки вида '3|7/3|8/4|7/4|8/'.