10 · Массивы
Срезы и представления
Частичное индексирование и диапазон TO выбирают строку, столбец или блок массива. При сохранении результата в переменную создаётся независимая копия выбранных элементов с сохранением их индексов. Непосредственный обход FOR EACH BYREF по выбранной области изменяет исходные элементы.
Формы записи
Копию выбранной области получают присваиванием результата индексирования массивной переменной. Фиксированный индекс исключает измерение из результата, диапазон TO сохраняет его с выбранными границами.
<копия>[] = <массив>[<фиксированный индекс>]<копия>[] = <массив>[<фиксированный индекс>, <начало> TO <конец>]<копия>[] = <массив>[<начало 1> TO <конец 1>, <начало 2> TO <конец 2>]Массив задаёт исходное хранилище. Фиксированный индекс является числовым выражением и выбирает координату измерения, исключаемого из результата. Начало и конец являются числовыми выражениями и задают включительный диапазон сохраняемого измерения. Нижняя граница диапазона не должна быть больше верхней: обратный диапазон вызывает MB3002. Пустые массивы создают функции выборки, а не обратный диапазон. Целевая переменная должна быть массивом подходящего типа и ранга, а источник должен быть выделен; графический режим не требуется.
Копирование и границы
Сохранённая область становится отдельным массивом: её изменение не меняет исходные элементы. Границы остаются границами выбранной области, поэтому индексы не перенумеровываются.
Копия первоначально содержит те же значения, но последующие записи независимы.
DIM board[1 TO 2, 2 TO 4] AS INTEGER
board[2, 3] = 20
DIM rowPart[] AS INTEGER
rowPart[] = board[2]
PRINT rowPart[3]
rowPart[3] = 99
PRINT board[2, 3]Программа выводит:
20
20Строка выбрана фиксированным индексом 2, поэтому измерение столбцов стало единственным измерением rowPart[]. Номер столбца при этом не изменился: элемент читается как rowPart[3], а не как rowPart[1]. Запись в rowPart[3] изменила только копию; board[2, 3] сохранил значение 20.
Обычное присваивание, ARRAYCLONE и ARRAYSLICE создают независимые данные; графический режим не требуется. Сохранённая копия является обычным массивом: её можно независимо изменять, перевыделять через REDIM и освобождать через ERASE. Непосредственное представление, переданное встроенной операции без сохранения, сохраняет связь с источником: ARRAYFILL, ARRAYREVERSE и ARRAYSORT изменяют выбранные исходные элементы. Изменение размера такого представления через ARRAYPUSH, ARRAYPOP, ARRAYINSERT или ARRAYREMOVE запрещено с MB3007.
Изменение размера источника
REDIM, REDIM PRESERVE, ERASE, ARRAYPUSH, ARRAYPOP, ARRAYINSERT и ARRAYREMOVE изменяют форму корневого массива и заменяют либо пересоздают его хранилище. Сохранённые ранее копии выбранных областей остаются действительными и не меняют содержимое. Непосредственный обход FOR EACH BYREF сохраняет связь с исходными элементами: изменение размера корня во время такого обхода делает ссылку на его элемент недействительной, а обращение к ней вызывает MB3014.
Если представление передаётся как значение в ARRAYPUSH или ARRAYINSERT, оно копируется до изменения размера корня. Поэтому срез собственного массива допустим как добавляемое значение.
Диагностика
Несовместимый тип элемента или индекса даёт MB2003, неверное число индексов — MB2004. Индекс или диапазон, вышедший за границы при индексировании, сообщается кодом MB3002; невыделенный массив и недопустимая пара границ — кодом MB3005. Запрещённая нижняя граница -2147483648 вызывает MB3007, выход числового значения за диапазон INTEGER — MB3008. MB3014 возникает при обращении через непосредственную ссылку на элемент, устаревшую после изменения размера или освобождения корня; сохранённая копия области от корня не зависит.
Для независимой копии выборки функции ARRAYSLICE, ARRAYTAKE и ARRAYSKIP имеют собственные правила пустых границ: функции выборки.