The occurrence of a formal-parameter-list in a procedure-heading of a procedure-declaration shall define the formal-parameters of the procedure-block, if any, associated with the identifier of the procedure-heading to be those of the formal-parameter-list.
The occurrence of an identifier in the procedure-heading of a procedure-declaration shall constitute its defining-point as a procedure-identifier for the region that is the block closest-containing the procedure-declaration.
Each identifier having a defining-point as a procedure-identifier in a procedure-heading of a procedure-declaration in which the directive forward occurs shall have exactly one of its applied occurrences in a procedure-identification of a procedure-declaration, and this applied occurrence shall be closest-contained by the procedure-and-function-declaration-part closest-containing the procedure-heading.
The occurrence of a procedure-block in a procedure-declaration shall associate the procedure-block with the identifier in the procedure-heading, or with the procedure-identifier in the procedure-identification, of the procedure-declaration.
There shall be at most one procedure-block associated with a procedure-identifier.
Examples of procedure-and-function-declaration-parts:
Example 1:
NOTE --- This example is not for level 0.
procedure AddVectors (var A, B, C : array [low..high : natural] of real);
var
i : natural;
begin
for i := low to high do A[i] := B[i] + C[i]
end {of AddVectors};
Example 2:
procedure readinteger (var f : text; var x : integer);
var
i : natural;
begin
while f = ' ' do get(f);
{The buffer-variable contains the first non-space char}
i := 0;
while f in ['0'..'9'] do begin
i := (10 * i) + (ord(f) - ord('0'));
get(f)
end;
{The buffer-variable contains a non-digit}
x := i
{Of course if there are no digits, x is zero}
end;
procedure bisect (function f(x : real) : real;
a, b : real;
var result : real);
{This procedure attempts to find a zero of f(x) in (a,b) by the method of bisection.
It is assumed that the procedure is called with suitable values of a and b such that
(f(a) < 0) and (f(b) >= 0)
The estimate is returned in the last parameter.}
const
eps = 1e-10;
var
midpoint : real;
begin
{The invariant P is true by calling assumption}
midpoint := a;
while abs(a - b) > eps * abs(a) do begin
midpoint := (a + b) / 2;
if f(midpoint) < 0 then a := midpoint else b := midpoint
{Which re-establishes the invariant: P = (f(a) < 0) and (f(b) >= 0)
and reduces the interval (a,b) provided that the value of midpoint is distinct from both a and b.}
end;
{P together with the loop exit condition assures that a zero is contained in a small subinterval.
Return the midpoint as the zero.}
result := midpoint
end;
procedure PrepareForAppending (var f : FileOfInteger);
{ This procedure takes a file in any state suitable for reset and places it in a condition for appending data
to its end. Simpler conditioning is only possible if assumptions are made about the initial state of the file.}
var
LocalCopy : FileOfInteger;
procedure CopyFiles (var from, into : FileOfInteger);