суббота, 25 февраля 2012 г.

Переменные

Перевод из справочной системы Delphi

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


Объявление переменных

Основной синтаксис объявления переменных:
var identifierList:type;

где identifierList – это список допустимых идентификаторов, разделенных запятыми, а type – любой допустимый тип. Например:

var I: Integer;
объявляет переменную I типа Integer, а
var X, Y: Real;
объявляет две переменных: X и Y типа Real.

При множественном объявлении переменных нет необходимости повторять ключевое слово var:

 var
    X, Y, Z: Double;
    I, J, K: Integer;
    Digit: 0..9;
    Okay: Boolean;

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

var identifier: type = constantExpression;

где constantExpression – это любое константное выражение, представляющее значение типа type. Таким образом, объявление:

var I: Integer = 7;
эквивалентно объявлению и инструкции:
var I: Integer;
     ...
 I := 7;

Локальные переменные не могут быть инициализированы при объявлении. Множественные объявления (например, var X, Y, Z: Real;) также не могут содержать инициализаций. Кроме того инициализация запрещена при объявлении переменных типа variant и переменных файлового типа.

Если вы явно не инициализируете глобальную переменную, компилятор устанавливает для нее значение 0. Данные из экземпляров объектов (поля) также инициализируются нолем. На платформе Wiin32 содержимое локальных переменных не определено до того момента, как им не будет присвоено значение.

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

Абсолютные адреса

Вы можете создать новую переменную, которая размещается в памяти по тому же адресу, что и другая переменная. Чтобы сделать это поместите директиву absolute после имени типа в объявлении новой переменной, а затем укажите имя уже существующей (объявленной ранее) переменной. Например, объявление:

var
   Str: string[32];
   StrLen: Byte absolute Str;

Указывает на то, что переменная StrLen должна начинаться в том же адресе, что и Str. Поскольку первый байт короткой строки, содержит ее длину, значением StrLen будет длина Str. Вы не можете инициализировать переменную в абсолютном объявлении или комбинировать абсолютное объявление с прочими директивами.

Динамические переменные

Вы можете создавать динамические переменные, вызывая процедуры GetMem или New. Такие переменные размещаются в куче и не управляются автоматически. Раз вы их создаете – ответственность за освобождение памяти, занятой переменной, в итоге ложится на вас. Для освобождения памяти переменных, созданных при помощи GetMem, следует использовать FreeMem, для переменных, созданных при помощи New – Dispose. Далее приведен список стандартных подпрограммы, работающих с динамическими переменными: ReallocMem, AllocMem, Initialize, Finalize, StrAlloc и StrDispose.

Длинные строки, переменные типа WideString, динамические массивы, переменные вариантных типов и интерфейсы также являются размещаемыми в куче динамическими переменными, но управление занимаемой ими памятью выполняется автоматически.

Локальные переменные потока

Локальные переменные потока (или потоковые переменные) используются во многопоточных приложениях. Локальная переменная потока схожа с глобальной, с тем лишь исключением, что поток получает собственную копию такой переменной, которая не доступна для других потоков. Локальные переменные потока объявляются при помощи ключевого слова threadvar, вместо var. Например:

threadvar X: Integer;
Объявления локальных переменных потока
  • Не могут появляться внутри процедуры или функции;
  • Не могут включать инициализацию;
  • Не могут включать директиву absolute.

Динамические переменные, которые обычно управляются компилятором (длинные строки, переменные типа WideString, динамические массивы, переменные вариантных типов и интерфейсы) могут быть объявлены как потоковые переменные, но компилятор не будет автоматически освобождать память кучи, созданную каждым потоком. Если вы используете эти типы в качестве переменных потока – отвественность за освобождение памяти этих переменных внутри потока до его разрушения ложится на вас. Например:

threadvar S: AnsiString;
 S := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   ...
 S := '';  // освобождение памяти, занятой S
Замечание: Использование такой конструкции не рекомендуется.

Вы можете очистить переменную типа variant, установив для нее значение Unassigned, а интерфейсную переменную или динамический массив – установив значение nil.

Комментариев нет:

Отправить комментарий