Массивы


автор AZJIO


Понятие "массив" в программировании является некоторое упорядоченное множество переменных, доступ к которым осуществляется по имени и индексу(ам). Чтобы легче представить возьмём примеры из жизни. Например обычная таблица являющаяся двумерным массивом, доступ к ячейкам которой осуществляется с помощью индексов по горизонтальным и вертикальным осям, отсчёт от 0. Также в качестве примера можно привести игры: шахматы, морской бой. В высшей математике аналог "матрица". Если в таблице один столбец, то горизонтальная ось отсчёта теряет смысл и это является аналогом одномерного массива. В большинстве случаев приходится сталкиваться только с одномерными и двумерными массивами.


Одномерный массив

В ниже приведённом примере создаётся массив из трёх ячеек. Индекс 0 соответствует первому элементу массива, индекс 1 - второму элементу массива, 2 - третьему. Попытка получить значение ячейки с индексом 3 приведёт к ошибке. Индекс последнего элемента на единицу меньше, чем число элементов в массиве. В коде можно обозначить одномерный массив как 1D, например Array1D.

ИндексыЗначения
0Array(0)
1Array(1)
2Array(2)

Define Dim Array1D$(2) ; объявление массива
Array1D$(1) = "Элемент2" ; присвоение данных ячейке массива
MessageRequester("Сообщение", Array1D$(1)) ; просмотр ячейки массива


Двумерный массив

Двумерный массив можно представить как обычную таблицу, шахматную доску, морской бой. Также как и в предыдущем примере необязательно указывать значения всех ячеек. В коде можно обозначить двумерный массив как 2D, например Array2D.

012
0Array(0, 0)Array(0, 1)Array(0, 2)
1Array(1, 0)Array(1, 1)Array(1, 2)
2Array(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