«Ни один ремесленник, который стремится к вершинам своей профессии, не примет негодных инструментов; и ни один производитель, который ценит качество работы, не будет упрашивать ремесленника принять их»
16. Переменные
Переменные можно разделить на два вида: глобальные и локальные (объявленные в блоке описаний подпрограммы). Глобальные переменные могут быть инициализированы при описании с использованием такого синтаксиса:
var identifier : type = constantExpression;
Здесь constantExpression – любое константное выражение. Пример:
var I: Integer = 7;
Одновременное описание нескольких переменных (var X, Y, Z: Real;) не может включать начальных значений. Так же нельзя инициализировать файловые переменные и варианты. Если глобальная переменная не инициализирована явно, ее инициализирует компилятор нулевым значением. Локальные переменные не могут инициализироваться явно и не инициализируются компилятором, вследствие чего содержат случайные значения.
Память, выделенная для глобальной переменной, освобождается автоматически, когда переменная больше не используется. Локальные переменные существуют только при выполнении той подпрограммы, где они объявлены.
Абсолютная адресация.
Для выделения памяти переменной по заданному адресу необходимо добавить к описанию переменной зарезервированное слово absolute и адрес. Пример:
var CrtMode: Byte absolute $0040;
Такой прием полезен только в низкоуровневых приложениях, например, при написании драйверов устройств. Для создания переменной, которая занимает ту же область памяти, что и существующая (прежде описанная) переменная, нужно после absolute указать имя этой переменной, например:
var
Str : string[32];
StrLen: Byte absolute Str;
Абсолютная переменная не может быть инициализирована при описании.
Динамические переменные.
Для динамических переменных память выделяется в динамической области памяти (heap) с помощью процедур New и GetMem. Выделенная таким образом память не освобождается автоматически и программист должен сделать это сам с помощью подпрограмм Dispose и FreeMem. Для управления распределением динамической памяти предназначены также подпрограммы ReallocMem, Initialize, StrAlloc и StrDispose.
Длинные строки и динамические массивы также располагаются в динамической памяти, однако память для них распределяется автоматически и применять к ним New или Dispose нельзя.
Локальные переменные потоков.
Эти переменные (thread-local variables) используются в многопоточных приложениях. Они подобны глобальным переменным за тем исключением, что каждый поток имеет свою собственную копию переменной и эта копия недоступна другим потокам.
Локальные переменные потоков объявляются с помощью зарезервированного слова threadvar вместо var, например:
threadvar X: Integer;
Объявления локальных переменных потоков:
v нельзя делать внутри подпрограмм;
v не могут включать инициализацию
v не могут быть абсолютными переменными.
Переменные, для которых поддерживается механизм подсчета ссылок –длинные строки, динамические массивы и интерфейсы, небезопасно использовать как локальные переменные потоков. Причина состоит в том, что для локальных динамических переменных потоков в общем случае нет хорошего способа освободить динамическую память. Нельзя также создавать локальные переменные потоков типа указателей или процедурного типа.
«15. Объявления типов»
17. Константы