Особенности использования процедур и функций в Турбо Паскале


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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.