Опережающее определение процедур и функций.
При уточнении начального алгоритма методом сверху вниз (при разбиение исходной задачи на подзадачи) в программе будут встречаться описания подпрограмм, которые располагаются ниже описания подпрограмм, которые их вызывают. Так происходит потому, что по правилам разработки алгоритма методом сверху вниз подпрограммы (вызываемы) в программе могут появляться только после (ниже по тексту программы) описания тех подпрограмм, часть действий в которых оформляется как подпрограммы (вызываемые).
Procedure A |
Procedure С |
Procedure B |
В С
2-й случай: сложная (взаимная) рекурсия
Procedure P |
Procedure Q |
Каждый из этих двух рассмотренных случаев связан с необходимостью определения порядка описания в программе используемых процедур: А, В, С, (1-й случай), P, Q (2-й случай).
Компилятор рассматривает текст программы сверху вниз. При этом все используемые (вызываемые) процедуры, функции, константы, переменные и метки должны быть известны (описаны) до момента их использования. В противном случае компилятор сообщит, что используется неизвестное имя, и воспримет это как ошибку. В первом случае, если описать процедуры в том порядке, в котором они появлялись в поле зрения разработчика программы (A – B – C) , то в процедуре А неизвестными окажутся имена В и С.
Есть две возможности устранения подобных ошибок:
1. Изменить порядок описания процедур в тексте программы.
В 1-ом случае, чтобы устранить ошибку нужно поместить описание процедур В и С перед описанием процедуры А.
Во 2-ом случае перестановка P и Q не к чему не приведет. Для устранения этой ошибки для процедур и функций есть директива forward. При ее использовании оба примера были бы записаны следующем образом:
1-й случай:
Одни заголовки (прототипы в Си) |
procedure C (...); forward;
procedure A (...);
Описание А |
...
Вызов процедуры В и С |
C(...);
...
end;
procedure B;
Описание В и С |
...
Замечания: 1) директива forward указывает компилятору, что описывается только заголовок. Полное описание будет сделано ниже по тексту программы. Задача оператора forward сделать известными имена процедур и функций (т.н. внешние имена). 2). В прототипе (опережающем описании) подпрограммы все параметры должны быть описаны полностью. А в заголовке подпрограммы при ее объявлении имена параметров можно опустить (оставить лишь тип): procedure B, procedure C, procedure Q. Можно опустить и список параметров и (для функций) тип возвращаемого значения, оставив лишь имя подпрограммы. |
procedure C;
begin
...
end;
2-й случай:
procedure Q(...); forward;
procedure P(...);
begin
вызов Q(…);
...
end;
procedure Q;
begin
вызов Р(…);
...
end;
Дата добавления: 2016-05-28; просмотров: 2163;