- 118 -
Это, во-первых, освобождает нас от обязательства использовать везде один и тот же идентификатор, а во-вторых, позволяет при необходимости менять структуру обращения к данным. Пример подобной организации подпрограмм дан на рис. 6.14.
| TYPE
| >Vector100Type = Array[1..100] of Real; {вектор }
| >MatrixType = Array[1..10,1..10] of Real; { матрица }
| >Matrix2Type = Array[1..50,1..2 ] of Real; { матрица }
| VAR
| >V : Vector100Туре: { область памяти на 100 элементов }
| PROCEDURE P1;
| >VAR M : MatrixType absolute V; { M совмещается с V }
| BEGIN
| > В процедуре возможны обращения M[ i,j ], эквивалентные
| > обращениям V[(i-1)*10+j]
| END;
| PROCEDURE P2;
| >VAR M2 : Matrix2Type absolute V; { M2 совмещается с V }
| BEGIN
| > В процедуре возможны обращения M2[ i,j ], эквивалентные
| > обращениям V(i-1)*2+j]
| END;
| PROCEDURE P3;
| >VAR V3 : Vector100Type absolute V; {V3 совмещается с V}
| BEGIN
| > Обращения V3[i] в процедуре эквивалентны обращениям V[i]
| END;
| BEGIN
| >Основной блок, содержащий вызовы P1, P2, P3 и, может быть,
| > обращения к общей переменной (области памяти) V
| END.
Рис. 6.14
Здесь процедуры имеют доступ к одной и той же области данных (т.е. к ста вещественным значениям), но осуществляют его разными методами. Поскольку нельзя совмещать значения локальных переменных с локальными, как минимум одна переменная из разделяющих общую область памяти должна быть глобальной. В примере на рис. 6.14 это переменная V.
- 119 -
Описанный выше прием программирования аналогичен, по сути, объявлению общих блоков в языке Фортран и во многих случаях позволяет составлять компактные и эффективные программы.
6.9.6.2. Статические локальные переменные. Обыкновенные локальные переменные в подпрограммах всегда «забывают» свое значение в момент окончания работы соответствующей подпрограммы. А при повторном вызове стартовые значения локальных переменных совершенно случайны. И если надо сохранять от вызова к вызову какую-нибудь локальную информацию, то ни в коем случае нельзя полагаться на локальные переменные, описанные в разделах VAR процедур и функций или как параметры-значения в заголовках. Для сохранности между вызовами информация должна храниться вне подпрограммы, т.е. в виде значения глобальной переменной (переменных). Но в этом случае приходится отводить глобальные переменные, по сути, под локальные данные. Турбо Паскаль позволяет решать эту проблему, используя статические локальные переменные или, что то же самое, локальные переменные со стартовым значением. Они вводятся как типизированные константы (рис. 6.15) по тем же правилам, что и их глобальные аналоги (см. разд. 5.2.2).