Особенности использования процедур и функций в Турбо Паскале
1. Если формальным параметром процедуры или функции является параметр - значение, то при вызове этой процедуры или функции соответствующим фактическим параметрам может быть любое выражение (частный случай выражения: переменная, константа). Если формальным параметром является параметр-переменная, то при вызове процедуры или функции фактическим параметром может быть только переменная эквивалентного типа.
2. Типом любого формального параметра может быть либо стандартный тип, либо тип ранее определенный в секции описания типов. (Нельзя конструировать типы в заголовках процедур и функций).
Вывод: Если надо передать нестандартный тип в процедуру или функцию, то этот тип следует до (выше) описания подпрограммы определить (описать в секции определения типов), а в заголовке подпрограммы должна быть только ссылка на этот тип.
хотя можно: Function summa (a: array of byte): integer;
неверная запись
Function summa (a: array [1..10] of byte): integer;
надо
Type
t = array [1..10] of byte;
function summa (a : t) : integer;
Требование запрета конструирования типов в заголовке процедуры и функции, введено для обеспечения совместимости типов формальных и фактических параметров-переменных, поскольку по правилам Паскаля то, что описано в разных местах, имеет разные типы.
3. Тип параметра значения может быть любым, кроме файлового. Тип параметра переменнойможет быть любым, включая файловый.
Вывод: Если необходимо в процедуру или функцию передавать файл, то он должен быть передан как параметр переменная.
4. Фактически при передаче параметров в процедуру и функцию по значению, значения этих параметров копируются в стек, что приводит к потерям времени и памяти на такое копирование. Если копируемые значения являются сложными (записи, большие массивы и т.д.), то чтобы избежать потерь времени от такого копирования есть две возможности:
1) Можно передавать длинные фактические параметры не как параметры-значения, а как параметры-переменные (по адресу). В этом случае в стек копируется не значение, а только адрес начала параметра. Неудобства этого способа состоит в том, что а) во время работы подпрограммы значение фактического параметра может быть заменено, что м.б. нежелательно, б) ухудшается понятность программы (по адресу принято передавать только результаты, а мы передаем входные данные).
2) Для избавления от этого недостатка можно использовать т.н. параметры-константы. Параметры-константы похожи на параметры-переменные тем, что передаются по адресу, т.е. в стек копируется адрес. Отличие состоит в следующем: в заголовке процедуры или функции вместо слова var указывается слово const
( const a : byte )
Компилятор при использовании параметра-константы жестко следит за тем, чтобы значение этих параметров не менялось.
5. Можно использовать параметр - переменную или параметр - константу без типа.
( …Var a; const b; …)
Они передаются только по адресу. Их использование позволяет избавиться от несовместимости типов формальных и фактических параметров. В этом случае фактический параметр может быть параметром любого типа. Сложность использования параметров без типа состоит в том, что в теле процедуры или функции их нельзя использовать без операции приведения типа.
6.Можно в качестве формального параметра использовать т.н. "открытые" массивы - массивы без границ. A : array of char;
В качестве фактического параметра для формального параметра типа открытого массива может выступить или статический (обычный) массив или динамический массив (в куче).
Наличие таких формальных параметров (открытых массивов) позволяет в качестве фактических параметров использовать в подпрограмме массивы любого размера (только тип элементов должен быть таким же). Конкретное число элементов массива определяется при вызове подпрограммы (на основании того, что передается в качестве фактического параметра). Имеется возможность в подпрограмме просмотреть нижнюю и верхнюю границы массива. Для этого используются стандартные функции low и high. Для открытых массивов low равно 0, high возвращает число элементов массива – 1. Так если имеется описания:
Var z:array[1..10] of integer;
…
Procedure P(x:array of integer);
Var
i : byte;
Begin
for i := low(x) to high(x) do
writeln(x[i]);
… вернет low(x)
end;
begin здесь элементы x[0] ≡ z[1]
… x[9] ≡ z[10]
P(z); вернет high(x)
...
end.
7.Можно использовать так называемые локальные статические переменные, которые отличаются от обычных локальных переменных глобальным временем жизни. Обычные локальные переменные имеют время жизни = времени выполнения процедуры или функции (где они объявлены), а статические локальные переменные имеют время жизни, равное времени выполнения всей программы (правда у них ограничена область видимости). Это достигается за счет того, что память под статические локальные переменные распределяется не в стеке, а в сегменте данных. Описываются статические локальные переменные в теле процедуры или функции как типизированные константы. Один из возможных вариантов использования статических локальных переменных - подсчет числа вызовов процедур или функций.
Function summa (...) : byte;
const
count : byte = 0; это действие выполняется лишь один раз за все время выполнения
begin программы. А именно – при первом вызове функции.
count := count + 1;
end;
8.Есть следующие возможности «внезапного» выхода из процедур или функций ( программы). Процедуры:
exit; - обеспечивает прекращение выполняемой процедуры или функции и возвращает управление в точку вызова (одноуровневый выход - на один уровень выше по цепочке вызовов).
Halt(n); - процедура используется для преждевременного выхода и из подпрограммы и из всей программы, на каком бы уровне вложенности подпрограмма бы не вызывалась.
n -код возврата; принято, если n = 0 то завершение было нормальным; если n > 0 то программа завершена некорректно. Код возврата анализируется или порождающим процессом с помощью DosExitCode (из модуля Dos), или помощью проверки ERRORLEVEL в командном файле.
Дата добавления: 2016-05-28; просмотров: 1902;