10 · Массивы
Форма и изменение размера массива
Программе часто нужно узнать, сколько элементов в массиве, где начинается измерение и выделен ли массив вообще. Другой круг задач связан с изменением самого массива: добавить элемент в конец, вставить его в середину, извлечь или удалить. Обе группы собраны на этой странице, и каждая функция имеет собственные формы вызова и результат.
Состав страницы
Здесь описаны отдельные встроенные функции LBOUND, UBOUND, ARRAYLENGTH, ARRAYISALLOCATED, ARRAYRANK, ARRAYBOUNDS, ARRAYPUSH, ARRAYPOP, ARRAYINSERT, ARRAYREMOVE. Формы ниже относятся к указанным функциям, а не к одной общей конструкции.
В формах вызова обозначение <массив> означает полное массивное выражение: values[], bag.values[], срез или результат функции. Например, ARRAYLENGTH(values[]) читает весь массив, а ARRAYCLONE(values[]) создаёт копию. Скобки вызова встроенной функции остаются круглыми. Операции доступны без графического режима. Обычно требуется выделенный массив, включая выделенный пустой массив, но ARRAYLENGTH, ARRAYISALLOCATED, ARRAYRANK и ARRAYCLONE допускают невыделенное состояние. Изменение размера запрещено для представления; изменение содержимого через представление видно в исходном массиве.
LBOUND
Функция LBOUND возвращает нижнюю границу выбранного измерения массива.
Синтаксис
LBOUND(<массив>)LBOUND(<массив>, <измерение>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
<измерение>: Целое число INTEGER выбирает измерение от 1 до ранга включительно. ROW равно 1, COLUMN равно 2. Без этого аргумента выбирается первое измерение, в том числе у многомерного массива.
Действие, результат и ограничения
Результат INTEGER. Без номера измерения выбирается первое измерение. Допустимы номера от 1 до ARRAYRANK(массив). Граница может быть отрицательной или нулевой.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. MB3005 возникает, если массив не выделен. MB3007 возникает для номера измерения вне 1..ARRAYRANK.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
PRINT LBOUND(a[])Ожидаемый вывод:
-1Пример многомерной формы
DIM board[-1 TO 0, 3 TO 4] AS INTEGER
board[-1, 3] = 4
board[-1, 4] = 1
board[0, 3] = 2
board[0, 4] = 3
PRINT LBOUND(board[], COLUMN)Ожидаемый вывод:
3UBOUND
UBOUND возвращает верхнюю границу выбранного измерения массива.
Синтаксис
UBOUND(<массив>)UBOUND(<массив>, <измерение>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
<измерение>: Целое число INTEGER выбирает измерение от 1 до ранга включительно. ROW равно 1, COLUMN равно 2. Без этого аргумента выбирается первое измерение, в том числе у многомерного массива.
Действие, результат и ограничения
Результат INTEGER. Без номера измерения выбирается первое измерение. Допустимы номера от 1 до ARRAYRANK(массив). Для канонического пустого диапазона 1 TO 0 верхняя граница равна 0.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. MB3005 возникает, если массив не выделен. MB3007 возникает для номера измерения вне 1..ARRAYRANK.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
PRINT UBOUND(a[])Ожидаемый вывод:
1Пример многомерной формы
DIM board[-1 TO 0, 3 TO 4] AS INTEGER
board[-1, 3] = 4
board[-1, 4] = 1
board[0, 3] = 2
board[0, 4] = 3
PRINT UBOUND(board[], COLUMN)Ожидаемый вывод:
4ARRAYLENGTH
ARRAYLENGTH возвращает число видимых элементов массива.
Синтаксис
ARRAYLENGTH(<массив>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
Действие, результат и ограничения
Результат INTEGER равен произведению видимых длин всех измерений. Невыделенный и выделенный пустой массивы дают 0; для различения состояний нужна ARRAYISALLOCATED.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. Невыделенное состояние допустимо. Аргумент должен быть массивом; несовместимое скалярное значение отклоняется при проверке программы.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
PRINT ARRAYLENGTH(a[])Ожидаемый вывод:
3ARRAYISALLOCATED
Функция ARRAYISALLOCATED проверяет, выделено ли хранилище элементов массива.
Синтаксис
ARRAYISALLOCATED(<массив>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
Действие, результат и ограничения
Результат BOOLEAN. Выделенный пустой массив даёт TRUE, невыделенный массив после DIM без границ или ERASE — FALSE.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. Невыделенное состояние допустимо. Аргумент должен быть массивом; несовместимое скалярное значение отклоняется при проверке программы.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
PRINT ARRAYISALLOCATED(a[])Ожидаемый вывод:
TRUEARRAYRANK
ARRAYRANK возвращает число измерений массива.
Синтаксис
ARRAYRANK(<массив>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
Действие, результат и ограничения
Результат INTEGER известен из объявления и доступен до выделения элементов и после ERASE.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. Невыделенное состояние допустимо. Аргумент должен быть массивом; несовместимое скалярное значение отклоняется при проверке программы.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
PRINT ARRAYRANK(a[])Ожидаемый вывод:
1ARRAYBOUNDS
Функция ARRAYBOUNDS возвращает таблицу нижних и верхних границ всех измерений.
Синтаксис
ARRAYBOUNDS(<массив>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
Действие, результат и ограничения
Результат INTEGER ранга 2 с границами (1 TO ранг, 1 TO 2). Столбец 1 содержит нижнюю границу, столбец 2 — верхнюю. Границы относятся к видимой форме, включая представления.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. MB3005 возникает, если массив не выделен.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
DIM b[,] AS INTEGER
b[] = ARRAYBOUNDS(a[])
PRINT b[1, 1]
PRINT b[1, 2]Ожидаемый вывод:
-1
1ARRAYPUSH
Вызов ARRAYPUSH добавляет элемент или срез в конец выбранного измерения массива.
Синтаксис
ARRAYPUSH(<массив>, <значение>)ARRAYPUSH(<массив>, <значение>, <измерение>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
<значение>: Для ранга 1 добавляемое значение должно быть совместимо с типом элемента. Для ранга 2 и выше передаётся выделенный массив того же типа элементов, ранга на 1 меньше; его границы должны совпадать со всеми невыбранными измерениями источника.
<измерение>: Целое число INTEGER выбирает измерение от 1 до ранга включительно. ROW равно 1, COLUMN равно 2. Для преобразований массива ранга 2 и выше этот аргумент обязателен.
Действие, результат и ограничения
Функция изменяет размер исходного массива и не возвращает значения. Ранг 1 принимает значение элемента, ранг 2 и выше — выделенный массив на один ранг меньше с точно совпадающими границами невыбранных измерений. Верхняя граница увеличивается на 1, нижняя сохраняется. Представление не может менять размер. Для добавления в пустой одномерный массив сначала выделите 1 TO 0.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. MB3005 возникает, если массив не выделен. MB2004 означает отсутствие обязательного номера измерения у массива ранга 2 и выше. MB3007 возникает для номера измерения вне ранга или попытки изменения размера представления. MB3007 также возникает при несовпадающих границах добавляемого среза или невозможности увеличения верхней границы. Невыделенный срез вызывает MB3005.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
ARRAYPUSH(a[], 7)
PRINT UBOUND(a[])
PRINT a[2]Ожидаемый вывод:
2
7Пример многомерной формы
DIM board[-1 TO 0, 3 TO 4] AS INTEGER
board[-1, 3] = 4
board[-1, 4] = 1
board[0, 3] = 2
board[0, 4] = 3
DIM rowValue[] AS INTEGER
rowValue[] = board[-1]
ARRAYPUSH(board[], rowValue[], ROW)
PRINT UBOUND(board[], ROW)
PRINT board[1, 3]Ожидаемый вывод:
1
4ARRAYPOP
ARRAYPOP снимает последний элемент или срез выбранного измерения массива.
Синтаксис
ARRAYPOP(<массив>)ARRAYPOP(<массив>, <измерение>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
<измерение>: Целое число INTEGER выбирает измерение от 1 до ранга включительно. ROW равно 1, COLUMN равно 2. Для преобразований массива ранга 2 и выше этот аргумент обязателен.
Действие, результат и ограничения
Возвращается снятый элемент для ранга 1 или самостоятельный массив ранга на 1 меньше для многомерного массива. Удаляется верхний индекс выбранного измерения. Пустое выбранное измерение недопустимо. При удалении последнего среза его диапазон становится 1 TO 0. Представление не может менять размер.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. MB3005 возникает, если массив не выделен. MB2004 означает отсутствие обязательного номера измерения у массива ранга 2 и выше. MB3007 возникает для номера измерения вне ранга или попытки изменения размера представления. Пустое выбранное измерение вызывает MB3007.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
PRINT ARRAYPOP(a[])
PRINT UBOUND(a[])Ожидаемый вывод:
3
0Пример многомерной формы
DIM board[-1 TO 0, 3 TO 4] AS INTEGER
board[-1, 3] = 4
board[-1, 4] = 1
board[0, 3] = 2
board[0, 4] = 3
DIM rowValue[] AS INTEGER
rowValue[] = ARRAYPOP(board[], ROW)
PRINT LBOUND(rowValue[])
PRINT rowValue[3]
PRINT UBOUND(board[], ROW)Ожидаемый вывод:
3
2
-1ARRAYINSERT
Функция ARRAYINSERT вставляет элемент или срез перед заданным индексом массива.
Синтаксис
ARRAYINSERT(<массив>, <индекс>, <значение>)ARRAYINSERT(<массив>, <индекс>, <значение>, <измерение>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
<индекс>: Целое число INTEGER задаёт логическую позицию вставки либо удаления.
<значение>: Для ранга 1 добавляемое значение должно быть совместимо с типом элемента. Для ранга 2 и выше передаётся выделенный массив того же типа элементов, ранга на 1 меньше; его границы должны совпадать со всеми невыбранными измерениями источника.
<измерение>: Целое число INTEGER выбирает измерение от 1 до ранга включительно. ROW равно 1, COLUMN равно 2. Для преобразований массива ранга 2 и выше этот аргумент обязателен.
Действие, результат и ограничения
Индекс допустим от нижней границы до верхней плюс 1. В пустом выбранном измерении допускается только индекс 1. Элементы от места вставки сдвигаются к большим индексам; верхняя граница растёт на 1. Для ранга 1 передаётся элемент; для большего ранга — выделенный массив ранга на 1 меньше с границами невыбранных измерений. Функция не возвращает значения; представление не может менять размер.
При добавлении элемента в конец одномерного массива функция использует запас ёмкости хранилища. Если запаса не хватает, хранилище увеличивается с копированием прежних элементов. Изменение размера делает прежние представления массива недействительными.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. MB3005 возникает, если массив не выделен. MB2004 означает отсутствие обязательного номера измерения у массива ранга 2 и выше. MB3007 возникает для номера измерения вне ранга или попытки изменения размера представления. MB3007 также возникает при несовпадающих границах добавляемого среза или невозможности увеличения верхней границы. Невыделенный срез вызывает MB3005. Индекс вне разрешённого диапазона вставки вызывает MB3007.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
ARRAYINSERT(a[], 0, 9)
PRINT a[0]
PRINT a[1]
PRINT UBOUND(a[])Ожидаемый вывод:
9
1
2Пример многомерной формы
DIM board[-1 TO 0, 3 TO 4] AS INTEGER
board[-1, 3] = 4
board[-1, 4] = 1
board[0, 3] = 2
board[0, 4] = 3
DIM rowValue[] AS INTEGER
rowValue[] = board[-1]
ARRAYINSERT(board[], 0, rowValue[], ROW)
PRINT board[0, 3]
PRINT board[1, 3]
PRINT UBOUND(board[], ROW)Ожидаемый вывод:
4
2
1ARRAYREMOVE
Вызов ARRAYREMOVE удаляет элемент или срез с заданным индексом массива и возвращает его.
Синтаксис
ARRAYREMOVE(<массив>, <индекс>)ARRAYREMOVE(<массив>, <индекс>, <измерение>)Аргументы
<массив>: Массив ранга 1 или выше задаёт видимую область обработки. Все элементы имеют тип, установленный при объявлении массива.
<индекс>: Целое число INTEGER задаёт логическую позицию вставки либо удаления.
<измерение>: Целое число INTEGER выбирает измерение от 1 до ранга включительно. ROW равно 1, COLUMN равно 2. Для преобразований массива ранга 2 и выше этот аргумент обязателен.
Действие, результат и ограничения
Индекс должен обозначать существующий элемент выбранного измерения. Возвращается удалённый элемент для ранга 1 или самостоятельный срез ранга на 1 меньше для большего ранга. Последующие элементы сдвигаются к меньшим индексам. При удалении последнего среза его диапазон становится 1 TO 0. Представление не может менять размер.
Удаление последнего элемента одномерного массива не требует копирования остальных элементов. Изменение размера делает прежние представления массива недействительными.
Диагностика
MB2004 означает неверное число аргументов; MB2003 — несовместимые типы. MB3005 возникает, если массив не выделен. MB2004 означает отсутствие обязательного номера измерения у массива ранга 2 и выше. MB3007 возникает для номера измерения вне ранга или попытки изменения размера представления. Пустое выбранное измерение и индекс вне его границ вызывают MB3007.
Пример
DIM a[-1 TO 1] AS INTEGER
a[-1] = 3
a[0] = 1
a[1] = 3
PRINT ARRAYREMOVE(a[], 0)
PRINT a[0]
PRINT UBOUND(a[])Ожидаемый вывод:
1
3
0Пример многомерной формы
DIM board[-1 TO 0, 3 TO 4] AS INTEGER
board[-1, 3] = 4
board[-1, 4] = 1
board[0, 3] = 2
board[0, 4] = 3
DIM rowValue[] AS INTEGER
rowValue[] = ARRAYREMOVE(board[], -1, ROW)
PRINT rowValue[3]
PRINT board[-1, 3]
PRINT UBOUND(board[], ROW)Ожидаемый вывод:
4
2
-1ARRAYSLICE
Встроенная функция ARRAYSLICE копирует выбранный диапазон. Все формы и точные границы результата описаны в отдельном блоке ARRAYSLICE.