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

10 · Массивы

Диагностика массивов

Работа с массивом может закончиться ошибкой типа, выделения, индекса или формы. На этой странице собраны коды, которые сообщают о таких случаях, и объяснено, какой именно случай стоит за каждым из них. Ошибки проверки программы обнаруживаются до запуска; ошибки времени выполнения можно перехватить оператором TRY.

Ошибки проверки программы

Массивное имя и поле требуют квадратных скобок: целый массив записывается как values[], элемент — как values[2]. Круглое обращение, имя массива без [], массивный суффикс после типа в DIM и вывод массива без суффикса имени не являются допустимыми формами. Причины и замены приведены в руководстве перехода.

Эти коды появляются до выполнения и указывают на несовместимость в самом тексте программы. MB2011 означает, что REDIM или ERASE получает значение, не являющееся массивом. MB2004 означает неверное число индексов либо отсутствие обязательного измерения у многомерной встроенной функции. MB2003 сообщает о несовместимом типе элемента, индекса, массивного аргумента или функции обработки. MB2025 запрещает REDIM и ERASE для фиксированного массивного поля TYPE. MB2057 сообщает, что сортировка по полю записи применена к неподходящему массиву, что имя поля не является строковой константой, поле отсутствует или не подлежит упорядочиванию. MB2058 сообщает о недопустимом направлении сортировки: допустимы только STEP 1 и STEP -1, и только в ARRAYSORT и ARRAYTOSORTED. MB2059 сообщает, что пустой литерал массива не получил тип элементов: рядом нет объявления или параметра с известным типом массива. MB2060 сообщает о значении, несовместимом с объявленным или выведенным типом элементов литерала, и о попытке вложить массив в литерал. MB2061 сообщает, что литерал массива использован там, где ожидается массив ранга 2 и выше. MB1002 сообщает, что ключевое слово языка использовано как имя, в том числе EACH и IN. MB2062 сообщает, что источник обхода FOR EACH не является массивом. MB2063 сообщает о недопустимом типе элемента обхода: для BYVAL тип AS может использовать обычное расширяющее преобразование, а для BYREF обязан точно совпадать с типом элемента. Справочные страницы объясняют литералы массивов и обход массива FOR EACH.

MB3002: индексирование за границами

Прямое обращение values[index] и диапазон TO требуют координат внутри включительных границ. Если индекс или конец диапазона выходит за границы, возникает MB3002. Тот же код сообщает об обратном диапазоне, когда нижняя граница TO больше верхней. Для каждого измерения проверьте LBOUND и UBOUND.

Поскольку это ошибка времени выполнения, её можно перехватить и продолжить работу:

DIM values[1 TO 2] AS INTEGER
TRY
    PRINT values[3]
CATCH err
    PRINT err.Code
END TRY
PRINT "Продолжение работы"

Программа выводит:

MB3002
Продолжение работы

Массив содержит два элемента с индексами 1 и 2, поэтому обращение к третьему вызывает ошибку, которую перехватывает CATCH. Строка после END TRY выполняется, и в выводе оказывается сообщение о продолжении работы.

MB3005: невыделенное хранилище или неверные границы

DIM без границ и ERASE оставляют массив невыделенным. Операции доступа к элементам и фактическим границам такого массива вызывают MB3005. ARRAYLENGTH, ARRAYRANK, ARRAYISALLOCATED и ARRAYCLONE допускают это состояние. MB3005 также возникает для обратных границ DIM или REDIM, кроме 1 TO 0.

MB3007: договор встроенной операции

MB3007 возникает при дробном индексе или дробной границе выделения, недопустимом номере измерения, отрицательном количестве ARRAYSLICE/ARRAYTAKE/ARRAYSKIP, индексе ARRAYINSERT/ARRAYREMOVE вне допустимого диапазона, пустом ARRAYPOP, несовместимых границах добавляемого среза и несовпадающем числе элементов ARRAYRESHAPE. Этот код также запрещает изменение размера представления и нижнюю границу -2147483648.

ARRAYPUSH и ARRAYINSERT отклоняют рост верхней границы 2147483647 до изменения массива. Пустые ARRAYSUM, ARRAYMIN, ARRAYMAX и ARRAYAVERAGE вызывают MB3007.

MB3013: предел выделения массива

Один массив может содержать не более 67 108 864 элементов. Если DIM, REDIM или функция с массивным результатом требует больше элементов, возникает MB3013. Этим же кодом сообщаются переполнение произведения длин измерений и нехватка памяти при выделении, поэтому процесс не завершается аварийно. Ошибку можно перехватить оператором TRY.

MB3014: устаревшее представление и обход

REDIM, REDIM PRESERVE, ERASE, ARRAYPUSH, ARRAYPOP, ARRAYINSERT и ARRAYREMOVE изменяют форму корневого массива. Ранее созданное представление после этого не связано с корнем: чтение и запись вызывают MB3014. Та же проверка защищает активный FOR EACH: изменение формы исходного массива или представления делает обход недействительным, и на следующей проверке продвижения возникает MB3014, даже если текущая была последней. Запись через ставший недействительным элемент BYREF также вызывает MB3014. Изменение только значений элементов форму не меняет. Ошибку можно перехватить оператором TRY.

Другие ошибки

MB3008 означает переполнение числового результата или преобразования индекса. MB3009 возникает при пустом значении функции обработки. Исключение, возникшее внутри пользовательской функции обработки, передаётся наружу с её кодом.

См. также

Выделение · Индексы · Базовые функции · Обработка · TRY