Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 78


| PROCEDURE XXXX( ...);

| VAR ... { обычные локальные переменные }

| CONST { статические локальные переменные }

| > A : Word = 240;

| > B : Real = 41.3;

| > ARR : Array[-1..1] of Char=('ф', 'х', 'ц');

| BEGIN

| > Тело процедуры, в котором могут изменяться значения

| > A, B, Arr и других переменных

| END.


Рис. 6.15

Особенность переменных, объявленных таким образом, заключается в том, что, хотя по методу доступа они являются строго локальными, свои значения они хранят вместе с глобальными переменными (в сегменте данных). Поэтому значения переменных A, B и Arr на рис. 16.15 сохранятся неизменными до следующего вызова процедуры и после него. В них можно накапливать значения при многократных обращениях к процедурам или функциям, их можно использовать как флаги каких-либо событий и т.п.

- 120 -

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

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

PROCEDURE PDemo ( VAR V1,V2 );

FUNCTION FDemo ( A : Integer; VAR V ) : Real;

Бестиповыми могут быть только параметры-переменные (т.е. те, которые передаются как адрес, а не как значение). Объявленные выше переменные V1, V2 и V могут иметь любой тип. Через них можно передавать подпрограммам строки, массивы, записи или другие данные. Но при этом процедура или функция должна явно задавать тип, к которому внутри нее приравниваются бестиповые переменные. Рассмотрим пример функции, суммирующей N элементов произвольных одномерных числовых массивов (рис. 6.16).


| >PROGRAM Demo_Sum;

| VAR

| > B1 : Array [-100.. 100] of Byte;

| > B2 : Array [ 0 .. 999] of Byte;

| > B3 : Array [ 'a'..'z'] of Byte;

| > S : String;

| >{$R-} { выключаем режим проверки индексов массивов }

| >FUNCTION Sum( VAR X; N : Word ) : LongInt;

| TYPE

| > XType = Array [ 1..1 ] of Byte;

| VAR

| > Summa : Longint; i : Word;

| BEGIN

| > Summa := 0;

| >for i:=1 to N do

| > Summa := Summa* XType( X )[i];

| > Sum := Summa