![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Особенности использования процедур и функций в Турбо Паскале
1. Если формальным параметром процедуры или функции является параметр - значение, то при вызове этой процедуры или функции соответствующим фактическим параметрам может быть любое выражение (частный случай выражения: переменная, константа). Если формальным параметром является параметр-переменная, то при вызове процедуры или функции фактическим параметром может быть только переменная эквивалентного типа. 2. Типом любого формального параметра может быть либо стандартный тип, либо тип ранее определенный в секции описания типов. (Нельзя конструировать типы в заголовках процедур и функций). Вывод: Если надо передать нестандартный тип в процедуру или функцию, то этот тип следует до (выше) описания подпрограммы определить (описать в секции определения типов), а в заголовке подпрограммы должна быть только ссылка на этот тип.
неверная запись 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]);
end;
P(z); вернет high(x) ... end. 7. Можно использовать так называемые локальные статические переменные, которые отличаются от обычных локальных переменных глобальным временем жизни. Обычные локальные переменные имеют время жизни = времени выполнения процедуры или функции (где они объявлены), а статические локальные переменные имеют время жизни, равное времени выполнения всей программы (правда у них ограничена область видимости). Это достигается за счет того, что память под статические локальные переменные распределяется не в стеке, а в сегменте данных. Описываются статические локальные переменные в теле процедуры или функции как типизированные константы. Один из возможных вариантов использования статических локальных переменных - подсчет числа вызовов процедур или функций. Function summa (...): byte; const
begin программы. А именно – при первом вызове функции. count: = count + 1; end; 8. Есть следующие возможности «внезапного» выхода из процедур или функций ( программы). Процедуры: exit; - обеспечивает прекращение выполняемой процедуры или функции и возвращает управление в точку вызова (одноуровневый выход - на один уровень выше по цепочке вызовов). Halt(n); - процедура используется для преждевременного выхода и из подпрограммы и из всей программы, на каком бы уровне вложенности подпрограмма бы не вызывалась. n -код возврата; принято, если n = 0 то завершение было нормальным; если n > 0 то программа завершена некорректно. Код возврата анализируется или порождающим процессом с помощью DosExitCode (из модуля Dos), или помощью проверки ERRORLEVEL в командном файле.
Популярное:
|
Последнее изменение этой страницы: 2016-07-12; Просмотров: 768; Нарушение авторского права страницы