Массивы
автор AZJIO
Понятие "массив" в программировании является некоторое упорядоченное множество переменных, доступ к которым осуществляется по имени и индексу(ам). Чтобы легче представить возьмём примеры из жизни. Например обычная таблица являющаяся двумерным массивом, доступ к ячейкам которой осуществляется с помощью индексов по горизонтальным и вертикальным осям, отсчёт от 0. Также в качестве примера можно привести игры: шахматы, морской бой. В высшей математике аналог "матрица". Если в таблице один столбец, то горизонтальная ось отсчёта теряет смысл и это является аналогом одномерного массива. В большинстве случаев приходится сталкиваться только с одномерными и двумерными массивами.
Одномерный массив
В ниже приведённом примере создаётся массив из трёх ячеек. Индекс 0 соответствует первому элементу массива, индекс 1 - второму элементу массива, 2 - третьему. Попытка получить значение ячейки с индексом 3 приведёт к ошибке. Индекс последнего элемента на единицу меньше, чем число элементов в массиве. В коде можно обозначить одномерный массив как 1D, например Array1D.
Индексы | Значения |
0 | Array(0) |
1 | Array(1) |
2 | Array(2) |
Define Dim Array1D$(2) ; объявление массива
Array1D$(1) = "Элемент2" ; присвоение данных ячейке массива
MessageRequester("Сообщение", Array1D$(1)) ; просмотр ячейки массива
Двумерный массив
Двумерный массив можно представить как обычную таблицу, шахматную доску, морской бой. Также как и в предыдущем примере необязательно указывать значения всех ячеек. В коде можно обозначить двумерный массив как 2D, например Array2D.
| 0 | 1 | 2 |
0 | Array(0, 0) | Array(0, 1) | Array(0, 2) |
1 | Array(1, 0) | Array(1, 1) | Array(1, 2) |
2 | Array(2, 0) | Array(2, 1) | Array(2, 2) |
Define Dim Array2D(3, 2) ; объявление массива
Define Dim Array2D(3, 2) ; 3 строки, 2 колонки
Define Dim Array2D(2, 3) ; 2 строки, 3 колонки
Array2D(1, 2) = 15 ; присвоение данных ячейке массива
MessageRequester("Сообщение", Str(Array2D(1, 2))) ; просмотр ячейки массива
Трёхмерный массив и более
Размерность массива три и более используется намного реже, поэтому рассмотрим их в одном разделе. Трёхмерный массив можно представить как куб, в котором ячейки располагаются не только в плоскости, но и в объёме. Аналогом является обычная трёхмерная система координат и доступ достигается с помощью трёх индексов (x, y, z). Четырёх-мерный и более визуально представить невозможно, но математически добавление измерения это просто добавление вектора измерения, например время, температура и т.д.
Define Dim Array3D(3, 2, 4) ; объявление массива
; количество ячеек в массиве равно произведению размерностей (3*2*4=24)
Array3D(2, 1, 3) = 15 ; присвоение данных ячейке массива
MessageRequester("Сообщение", Str( Array3D(2, 1, 3))) ; просмотр ячейки массива
Define Dim Array3D(3, 2, 5) ; трёхмерный массив
Define Dim Array4D(3, 2, 5, 1) ; четырёхмерный массив
Define Dim Array5D(3, 2, 5, 1, 7) ; пятимерный массив
; и т.д.
Перечисление двумерного массива
Перечисление двумерного массива можно начать с любой размерности, без принятия что-либо строками или колонками. Но в этому случае можно запутатся и сложнее представлять массив в виде таблицы. Поэтому за точку отсчёта можно принять, что первая размерность строки, а вторая - колонки. Тогда при использовании первой размерности ("i") основным циклом, а второй размерности ("j") вложенным циклом происходит построчный перебор данных, в той же последовательности, как человек читает текст, построчно слева-направо. В данном примере 2 строки и 3 колонки.
Define Dim Array2D$(2, 3)
For i = 0 To 2
For j = 0 To 3
Array2D$(i, j) = Str(i) + "." + Str(j)
Next
Next
For i = 0 To 2
For j = 0 To 3
Debug Array2D$(i, j)
Next
Next
Массив структур
Позволяет иметь разный тип данных связанных с одним элементом массива.
Structure People
Name.s
Age.i
EndStructure
Define Dim People.People(2)
People(0)\Name = "Андрей"
People(0)\Age = 15
People(1)\Name = "Сергей"
People(1)\Age = 26
People(2)\Name = "Костя"
People(2)\Age = 18
For i = 0 To 2
Debug People(i)\Name
Debug People(i)\Age
Next
Массив в структуре
Structure Team
Group.s
Array People$(3)
EndStructure
Define NewList Teams.Team()
AddElement(Teams())
Teams()\Group = "Команда парней"
Teams()\People$(1) = "Андрей"
Teams()\People$(2) = "Сергей"
Teams()\People$(3) = "Костя"
AddElement(Teams())
Teams()\Group = "Команда девчат"
Teams()\People$(1) = "Оксана"
Teams()\People$(2) = "Лариса"
Teams()\People$(3) = "Наташа"
ForEach Teams()
Debug Teams()\Group
For i = 1 To 3
Debug Teams()\People$(i)
Next
Next
Доступ к массиву по указателю
Иногда требуется передать функции указатель на число/строку, которая является элементом массива. Чтобы не делать копию строки в переменную, надо взять указатель прямо с элемента массива. Например для таких функций как CopyMemory(), CompareMemory()
Define Dim Array1(5)
For i = 0 To 5
Array1(i) = i * 2
Next
Debug PeekI(@Array1(3))
; структура
Structure People
Name.s
Age.i
EndStructure
Define Dim People.People(5)
People(0)\Name = "Андрей"
People(0)\Age = 15
Debug PeekI(@People(0)\Age)
Debug PeekS(@People(0)\Name)
*p = PeekI(@People(0) + OffsetOf(People\Name))
Debug PeekS(*p)
*p = @People(0) + OffsetOf(People\Age)
Debug PeekI(*p)
Передача массива в функцию по ссылке
Этот способ не создаёт новую копию массива, а работает непосредственно с оригиналом.
Часто при указывании ссылки на массив из-за забывчивости происходит путаница, в данном примере число 1 это не объявление числа элементов массива, а размерность, для 2D массива это будет 2.
Procedure FillingArray(Array Array2D(1)) ; здесь указана размерность массива (1 это одномерный)
Protected i
For i = 0 To 2
Array2D(i) = 33
Next
EndProcedure
Define Dim Array2D(2)
FillingArray(Array2D())
For i = 0 To 2
Debug Array2D(i)
Next