Массивы

Материал из UoPilot
Версия от 21:53, 27 августа 2019; Tatikoma (обсуждение | вклад) (Новая страница: « == Описание == Самый простой способ понять массивы - это рассматривать их как набор одноим...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Описание

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

#значение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/'.