
6.9 Показан операнд и типы результата.
адресный коэффициент
│ ┌───┐ ┌──────────────────────┐
└──│ @ ├──┬─────│ ссылка не переменную ├───────────────────────>
└───┘ │ └──────────────────────┘ ^
│ ┌─────────────────────────┐ │
├────>│ идентификатор процедуры ├───────────┤
│ └─────────────────────────┘ │
│ ┌───────────────────────┐ │
├────>│ идентификатор функции ├─────────────┤
│ └───────────────────────┘ │
│ ┌─────────────────────────────────┐ │
└────>│ уточненный идентификатор метода ├───┘
└─────────────────────────────────┘
Операция создания указателя Таблица 6.9
┌────────────┬───────────┬───────────────────────┬──────────────┐
│ Операция │ Действие │ Типы операндов │Тип результата│
├────────────┼───────────┼───────────────────────┼──────────────┤
│ @ │ Получение │ Ссылка на переменную, │ Указатель │
│ │ указателя │ процедуру или иденти- │ (совмести- │
│ │ │ фикатор функции. │ мый с nil) │
└────────────┴───────────┴───────────────────────┴──────────────┘
Операция @ возвращает адрес операнда, то есть строит значе-
ние-указатель, ссылающееся на этот операнд.
B.Pascal 7 & Objects/LR - 110 -
Использование операции @ для переменной
─────────────────────────────────────────────────────────────────
Использование операции @ для обычной переменной (не парамет-
ра) не вызывает никаких сложностей. Применение @ к ссылке на пе-
ременную возвращает указатель на переменную. Введем описания:
type
TwoChar = array[0..1] of char;
var
Int: integer;
TwoCharPtr: ^TwoChar;
тогда оператор:
TwoCharPtr := @Int;
приводит к тому, что TwoCharPtr для получения ссылки на
TwoCharPtr^ становится повторной интерпретацией значения Int, как
если бы оно было символьным массивом array[0..1].
Тип получаемого в результате указатель управляется директи-
вой компилятора $T: в состоянии {$T-} (по умолчанию) типом ре-
зультата будет Pointer. Другими словами, результат ом является
нетипизированный указатель, совместимый со всеми другими типами
указателей. В состоянии {$T+} типом результата будет ^T, где T -
тип ссылки на переменную. То есть тип результата будет совместим
со всеми другими указателями на тип этой переменной.
Примечание: К использованию операции @ с процедурным
типом применяются специальные правила. См. ниже раздел
"Процедурный типы в выражениях".
B.Pascal 7 & Objects/LR - 111 -
Использование операции @
для процедуры или функции или метода
─────────────────────────────────────────────────────────────────
Вы можете применять операцию @ к процедуре, функции или ме-
тоду. При этом вы получите указатель на точку входа подпрограммы.
Независимо от состояния $T, типом полученного в результате указа-
теля всегда будет Pointer. Другими словами, результатом всегда
является нетипизированный указатель, совместимый со всеми другими
ссылочными типами.
При применении операции @ к методу метод должен задаваться с
помощью уточненного идентификатора (идентификатора объектного ти-
па, за которым следует точка и идентификатор метода).
Вызовы функции
─────────────────────────────────────────────────────────────────
Вызовы функции приводят к активизации функции, заданной с
помощью идентификатора функции. Идентификатором функции является
любой идентификатор, использованный для обозначения функции.
Если в соответствующем описании функции содержится список
формальных параметров то в вызове функции должен содержаться спи-
сок фактических параметров. Каждый параметр подставляется вместо
соответствующего формального параметра в соответствии с набором
правил, который вводится в Главе 9 ("Процедуры и функции").
Примечание: См. выше разделы "Активизация методов",
"Активизация уточненных методов" и "Процедурные типы".
┌─────────────┐
вызов функции ─┬─>│идентификатор├─┬┬───────────────────────────>
│ │ функции │ ││ ^
│ └─────────────┘ ││ ┌──────────────────┐ │
│ ┌─────────────┐ │└──>│список фактических├──┘
├─>│ десигнатор ├─┤ │ параметров │
│ │ метода │ │ └──────────────────┘
│ └─────────────┘ │
│ ┌─────────────┐ │
│ │ уточненный │ │
├─>│ десигнатор ├─┤
│ │ метода │ │
│ └─────────────┘ │
│ ┌─────────────┐ │
└─>│ ссылка на ├─┘
│ переменную │
└─────────────┘
B.Pascal 7 & Objects/LR - 112 -
┌───┐ ┌───────────┐ ┌───┐
список фактических ────>│ ( ├─────>│фактический├──┬─>│ ) ├───>
параметров └───┘ ^ │ параметр │ │ └───┘
│ └───────────┘ │
│ ┌───┐ │
└───┤ , │<────────┘
└───┘
┌────────────┐
фактический параметр ──┬──>│ выражение ├────────>
│ └────────────┘ ^
│ ┌────────────┐ │
└──>│ ссылка на ├───┘
│ переменную │
└────────────┘
Приведем некоторые примеры вызовов функций:
Sum(A,63)
Maximum(147,J)
Sin(X+Y)
Eof(F)