Axiom Справочник языка

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)

Ожидаемый вывод:

3

UBOUND

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)

Ожидаемый вывод:

4

ARRAYLENGTH

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[])

Ожидаемый вывод:

3

ARRAYISALLOCATED

Функция 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[])

Ожидаемый вывод:

TRUE

ARRAYRANK

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[])

Ожидаемый вывод:

1

ARRAYBOUNDS

Функция 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
1

ARRAYPUSH

Вызов 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
4

ARRAYPOP

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
-1

ARRAYINSERT

Функция 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
1

ARRAYREMOVE

Вызов 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
-1

ARRAYSLICE

Встроенная функция ARRAYSLICE копирует выбранный диапазон. Все формы и точные границы результата описаны в отдельном блоке ARRAYSLICE.

См. также

Массивы · Представления · Диагностика массивов · FUNCTION