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

Глава 2 · Переменные и значения

Оператор DIM

DIM объявляет переменную с заданным или выведенным из выражения типом и устанавливает её начальное значение. В объявлении массива указывается также число измерений; если заданы границы, DIM выделяет элементы.

Формы объявления

Переменная с явным типом

DIM <имя> AS <тип>
DIM <имя> AS <тип> = <выражение>

<имя> выбирается по правилам записи имён. Часть после AS задаёт встроенный или пользовательский тип, в том числе функциональный. Для массива квадратные скобки ставятся после имени, а после AS указывается тип элемента. Если указано начальное выражение, его результат должен быть совместим с объявленным типом. В объявлении без выражения используется значение по умолчанию.

Тип по начальному значению

DIM <имя> = <выражение>

Без AS компилятор выводит тип переменной из выражения справа от знака =. Такое объявление обязательно содержит начальное выражение. Выведенный тип сохраняется при всех последующих присваиваниях. Если выражение возвращает массив, имя обязательно записывается с квадратным суффиксом, как показано ниже; обычное объявление без суффикса не выводит массивный тип.

DIM count = 3
count = count + 2
PRINT count

Переменная count имеет тип INTEGER. Результат программы:

5

Несколько переменных

DIM <имя1>, <имя2> AS <тип>
DIM <имя1>, <имя2> AS <тип> = <выражение>
DIM <имя1> AS <тип1>, <имя2> AS <тип2>

В группе имён перед общей частью AS все переменные получают один тип. Через запятую можно продолжить объявление следующей группой со своим типом и начальным выражением. Если у группы нет AS, компилятор выводит её тип по начальному выражению.

DIM enabled, visible AS BOOLEAN, title AS STRING = "Отчёт"
PRINT enabled, visible, title

Обе логические переменные получают FALSE, строковая переменная получает текст заголовка:

FALSE FALSE Отчёт

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

Массив с границами

DIM <имя>[<нижняя граница> TO <верхняя граница>] AS <тип элемента>
DIM <имя>[<нижняя1> TO <верхняя1>, <нижняя2> TO <верхняя2>] AS <тип элемента>

Каждый диапазон в скобках после имени задаёт нижнюю и верхнюю границы одного измерения массива. Обе границы входят в диапазон допустимых индексов; диапазоны разных измерений разделяются запятыми. Запись только с верхней границей, например DIM items[3] AS INTEGER, не поддерживается.

DIM вычисляет границы во время выполнения. Выражения границ могут иметь тип INTEGER, LONG, DOUBLE или DECIMAL, однако каждое значение должно быть целым и помещаться в INTEGER. Дробная часть не отбрасывается: при её наличии возникает ошибка. Нижняя граница -2147483648 запрещена. Правила пустого диапазона 1 TO 0 и предел выделения описаны в главе массивов.

Объявление с границами не принимает начальное выражение массива. После выделения элементы заполняются значениями по умолчанию; нужные данные записываются присваиванием элементов. Объявление с пустыми скобками может получать начальное значение массива.

Динамический массив без элементов

DIM <имя>[] AS <тип элемента>
DIM <имя>[,] AS <тип элемента>

Пустые квадратные скобки объявляют одномерный массив; одна запятая в скобках задаёт два измерения, а каждая следующая добавляет ещё одно. Объявление определяет тип элемента и число измерений, но не выделяет элементы. Для выделения используется REDIM.

DIM grid[,] AS INTEGER
PRINT ARRAYISALLOCATED(grid[])
REDIM grid[1 TO 2, 1 TO 3]
PRINT ARRAYRANK(grid[]), ARRAYLENGTH(grid[])

До REDIM массив не выделен. После REDIM массив содержит шесть элементов и имеет два измерения:

FALSE
2 6

Массив с начальным значением

Начальное выражение может возвращать массив: например, результат SPLIT, вызова пользовательской функции или обращения к существующему массиву. При явном типе квадратные скобки после имени показывают, что объявляется массив:

DIM <имя>[] AS <тип элемента> = <выражение массива>
DIM <имя>[,] AS <тип элемента> = <выражение массива>

В DIM массивный суффикс допустим только после имени. Запись суффикса после типа не является второй формой объявления массива.

Пустые квадратные скобки обозначают одно измерение; одна запятая внутри скобок задаёт два измерения, две — три. Тип элемента и число измерений результата должны совпадать с объявленными. Например:

DIM fruits[] AS STRING = SPLIT("яблоко,банан,апельсин", ",")
PRINT fruits[2]

Результат:

банан

Без AS тип элемента определяется по начальному выражению, а квадратный суффикс после имени обязателен. Число измерений результата должно совпадать с рангом, заданным суффиксом:

DIM <имя>[] = <выражение массива>
DIM <имя>[,] = <выражение массива>
DIM fruits[] = SPLIT("яблоко,банан,апельсин", ",")
PRINT fruits[2]

Эта программа также выводит банан. Объявления с явным и выведенным типом вычисляют выражение один раз для каждого объявляемого имени. Границы, состояние выделения и ограничения элементов сохраняются у полученного массива. Начальное значение может быть невыделенным массивом, выделенным пустым массивом или представлением.

Инициализация создаёт независимую копию по правилам присваивания массивов: DIM basket[] = fruits[] копирует исходные элементы и вложенные данные. Справа пустые квадратные скобки обозначают массив целиком; имя массива без квадратных скобок недопустимо. Явная функция ARRAYCLONE(fruits[]) также создаёт копию. Сохранённый срез массива становится независимым массивом с выбранными границами.

Объявления с заданными границами вместе с начальным выражением отклоняются с MB2003. Та же диагностика выдаётся при несовпадении типа элемента или числа измерений, а также при попытке инициализировать объявленный массив обычным значением.

Строка фиксированной длины

DIM <имя> AS STRING * <длина>
DIM <имя> AS STRING * <длина> = <выражение>

Длина задаётся целочисленной константой от 1 до 65535 и измеряется в кодовых единицах UTF-16. Короткое значение дополняется пробелами справа, длинное обрезается. Без начального выражения строка состоит из пробелов. Подробности: STRING и фиксированная длина.

Начальные значения

Начальное выражение вычисляется каждый раз, когда выполняется объявление. Если DIM обычной переменной находится в теле цикла, при следующем проходе значение переменной устанавливается заново.

При отсутствии выражения используются следующие значения:

ТипНачальное значение
INTEGER, LONG, DOUBLE, DECIMAL0
BOOLEANFALSE
Обычная STRINGПустая строка
DATE0001-01-01
TIME00:00:00
DATETIME0001-01-01 00:00:00
UTCDATETIME0001-01-01T00:00:00Z

Поля пользовательской записи получают значения по умолчанию согласно правилам TYPE. Начальное состояние файлов и графических ресурсов описано на страницах соответствующих типов в карте типов данных.

Место объявления

DIM разрешён на верхнем уровне файла, в подпрограмме и внутри блока, например IF или FOR. Место объявления определяет область видимости имени. Повторное объявление в той же области и перекрытие доступного внешнего имени запрещены.

Параметр подпрограммы, счётчик FOR и переменная CATCH объявляются соответствующей конструкцией. Отдельный DIM для них не нужен.

Доступность в модуле

PUBLIC DIM <часть объявления после DIM>
PRIVATE DIM <часть объявления после DIM>

Перед DIM верхнего уровня можно указать PUBLIC или PRIVATE; далее используется одна из форм объявления, приведённых выше. С PUBLIC имя доступно файлам, которые явно импортируют этот модуль. С PRIVATE или без модификатора имя доступно только внутри файла. Для вложенного объявления модификатор недопустим. Правила доступности и импорта описаны в статьях PUBLIC и PRIVATE и IMPORT.

Диагностика

  • MB2017: опущены и тип, и начальное выражение.
  • MB2002: имя уже объявлено в той же области.
  • MB2016: новое имя перекрывает доступное имя внешней области.
  • MB2001: начальное выражение обращается к неизвестному или недоступному имени.
  • MB2003: начальное значение несовместимо с типом или числом измерений либо начальное выражение задано для массива с границами.
  • MB2026: недопустимая длина или форма объявления фиксированной строки.
  • MB3007: граница массива имеет дробную часть либо равна запрещённой нижней границе.
  • MB3008: значение границы не помещается в INTEGER.
  • MB3005: недопустимое соотношение границ массива. Этот же код выдаётся при обращении к элементу массива до выделения; само динамическое объявление без элементов допустимо.
  • MB3013: превышен предел выделения массива или не удалось выделить память.

Запускаемые примеры

См. также

Присваивание изменяет значение объявленной переменной. CONST объявляет именованное значение, защищённое от записи. Глава массивов описывает размещение элементов и ограничения формы.

Кортежи

Связанные значения разных типов можно хранить в кортеже, объявлять с полным или общим типом группы, передавать функции и распаковывать. Все формы и примеры приведены на странице кортежей.

Совет о неиспользуемом значении в IDE

Совет MB2047 относится к объявлению, значение которого нигде не читается. Присваивание и INPUT записывают значение и сами по себе не считаются чтением. В проектном режиме IDE учитывает чтения связанного символа в графе IMPORT выбранного файла запуска, включая несохранённый текст открытых модулей. Закрытые исходники читаются с диска при проверке. Одноимённая локальная переменная другого модуля не считается чтением этого объявления; PUBLIC не освобождает объявление от проверки.

При смене файла запуска и восстановлении проекта советы пересчитываются автоматически. Файл вне графа выбранного запуска проверяется отдельно. Если граф не удалось корректно разобрать или связать, отсутствие использования не объявляется доказанным: сначала устраняются ошибки проекта.