Мегаобучалка Главная | О нас | Обратная связь


Передача данных через параметры



2015-12-14 563 Обсуждений (0)
Передача данных через параметры 0.00 из 5.00 0 оценок




Список параметров описывается в заголовке подпрограммы (рис. 5.4). Параметры, перечисленные в этом списке, получили название формальных, так как для их размещения не отводится память. При обращении к подпрограмме для каждого параметра должно быть указано фактическое значение - литерал, константа или переменная того же типа, что и формальный параметр. Несоответствие типов и количества формальных и фактических параметров выявляется компилятором (или компоновщиком, если вызов подпрограммы происходит из другого модуля см. далее). Нарушение порядка следования фактических параметров, если

это нарушение не связано с несовпадением количества параметров или их типов, приводит к нарушению логики работы программы и часто может быть обнаружено только при тестировании программы.

В Borland Pascal параметры в подпрограмму могут передаваться тремя способами:

· как значения - в подпрограмму передаются копии значений параметров, и никакие изменения этих копий не возвращаются в вызывающую программу;

· как переменные - в подпрограмму передаются адреса фактических параметров, соответственно все изменения этих параметров в подпрограмме на самом деле происходят с переменными, переданными в качестве фактических параметров; такие параметры при описании помечаются служебным словом var; в качестве фактических значений параметров-переменных нельзя использовать литералы,

· как неизменяемые переменные (именованные константы) - в подпрограмму, так же как и в предыдущем случае, передаются адреса фактических параметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке; такие параметры при описании помечаются служебным словом const.

Вызов процедур и функций.

И процедура, и функция, используя параметры-переменные, могут изменять значения переменных основной программы. Но как отмечалось выше, функция отличается от процедуры тем, что кроме изменения значений параметров-переменных всегда возвращает в точку вызова скалярное значение, строку или указатель. Поэтому в теле функции обязательно наличие специальной переменной с именем функции, которой должно присваиваться значение. Именно это значение и будет возвращено в место вызова функции в качестве ее результата. Вызов функции, таким образом, можно осуществлять в составе выражений везде, где возможно использование выражений (в операторе присваивания, в операторе вывода и т.д.), например:

<переменная>:=<имя функции>(<фактические параметры>).

Процедура же должна вызываться отдельным оператором, состоящим из имени процедуры и списка фактических параметров:

<имя процедуры>(<фактические параметры>).

Вызов процедуры и функции по-разному изображается на схеме алгоритма: вызов функции - в блоке «процесс» или блоке вывода, а для вызова процедуры используется специальный блок «предопределенный процесс». Схемы алгоритмов же самих подпрограмм в обоих случаях оформляются отдельно, причем вместо слова «начало» указывают имя подпрограммы, а вместо слова «конец» - указывают слово «возврат» или «return».

 

Описания near и far

Borland Pascal поддерживает две модели вызова процедур ближнюю (near) и дальнюю (far). С точки зрения объема программы и скорости выполнения ближняя модель вызова более эффективна, но с ней связаны ограничения: процедуры типа near могут вызываться только в том модуле, где они описаны. Процедуры же с дальним типом вызова можно вызывать из любого модуля, но они несколько менее эффективны.

Примечание: О вызовах ближнего и дальнего типа расска зывается в Главе 22 "Вопросы управления".

На основе описания процедуры компилятор будет автоматически выбирать правильную модель вызова. Для процедур, описанных в интерфейсной части модуля (interface), используется дальняя модель вызова - их можно вызывать из других модулей. Процедуры, описанные в секции реализации модуля (implementation), имеют ближний тип вызова. Вызываться они могут только из программ данного модуля.

Для некоторых специальных целей может потребоваться использовать модель с дальним типом вызова. Например, в оверлейных задачах обычно требуется, чтобы все процедуры и функции имели дальний тип вызова. Аналогично, если процедура или функция присваивается процедурной переменной, то она также должна использовать дальний тип вызова. Чтобы переопределить автоматический выбор модели вызова компилятором, можно использовать директиву компилятора {$F+}. Процедуры и функции, компилируемые в состоянии {$F+}, всегда будут иметь дальний тип вызова (far), а в состоянии {$F-} компилятор автоматически выбирает корректную модель. По умолчанию используется директива {$F-}.

Чтобы задать конкретную модель вызова, в описании процедуры перед ее блоком можно указать директиву near или far. При наличии такой директивы она переопределяет директиву $F компилятора и автоматический выбор модели вызова.

Описание forward

Описание процедуры, содержащее вместо блока операторов директиву forward, называется опережающим описанием. В каком-либо месте после этого описания с помощью определяющего описания процедура должна определяться. Определяющее описание - это описание, в котором используется тот же идентификатор процедуры, но опущен список формальных параметров и в которое включен блок операторов. Описание forward и определяющее описание должны присутствовать в одной и той же части описания процедуры и функции. Между ними могут описываться другие процедуры и функции, которые могут обращаться к процедуре с опережающим описанием. Таким образом возможна взаимная рекурсия.

Опережающее описание и определяющее описание представляют собой полное описание процедуры. Процедура считается описанной с помощью опережающего описания.

Примечание: В интерфейсной части модуля описания forward не допускаются.

Приведем следующий пример опережающего описания:

procedure Walter(m,n : integer); forward; procedure Clara(x,y : real); begin . . . end; procedure Walter; begin . . Clara(8.3, 2.4); . . end;

Определяющее описание процедуры может быть внешним описанием. Однако, оно не может быть внутренним описанием или другим опережающим описанием. Определяющее описание также не может содержать директиву interrupt, описания assembler, near, far, export, inline или другое описание forward.

Рекурсия

Подпрограммы в Паскале могут обращаться сами к себе. Такое обращение называется рекурсией.

· рекурсивной называется такая процедура или функция, которая вызывает сама себя;

· для завершения процесса рекурсии в алгоритме рекурсивной функции (процедуры) обязательно должно быть условие, обеспечивающее непосредственное завершение функции (процедуры).

 

 

program ex2;

uses crt;

procedure B(i:integer); forward;

procedure A; far;

begin

writeln('Is A');

B(3);

end;

 

procedure B;

begin

writeln('Is B',i);

end;

function F(n:integer):integer;

begin

if (n = 1) then

begin

F:=1;

end

else

begin

F:=n*F(n-1);

end;

end;

 

begin

A;

writeln(F(4));

readln;

end.

 

Модули

При разработке больших программ целесообразно часть подпрограмм и других ресурсов, таких, как переменные, константы, описания типов, собирать вместе и компилировать отдельно от основной программы в виде библиотек ресурсов или модулей.

Модуль – это автономно компилируемая коллекция программных ресурсов, предназначенная для использования другими модулями и программами.

Все ресурсы модуля делятся на две группы: внешние - предназначенные для использования другими программными единицами, и внутренние - рабочие ресурсы данного модуля.

Структура модуля выглядит следующим образом:

Имя модуля должно совпадать с именем файла, в котором он содержится. Результат компиляции модуля помещается в файл с тем же именем и расширением .tpu.

Примечание. Среда языка Borland Pascal предусматривает три режима компиляции программы, использующей модули:

Compile - компилируется только основная программа, все модули должны быть предварительно откомпилированы в файлы <имя модуля>.tpu и размещены либо в текущем каталоге, либо в одном из каталогов, указанных как источники файлов .tpu в настройках среды (Options/Directories);

Make - модули, для которых не обнаружены файлы .tpu, компилируются из соответствующих файлов .pas, которые должны находиться в текущем каталоге или в каталогах, указанных в настройках среды в качестве источников исходных файлов модулей;

Build - все ранее откомпилированные модули .tpu игнорируются и все модули компилируются из своих исходных файлов заново.

В процессе отладки модулей целесообразно использовать режим Build, а при отладке программы - режим Compile.

Интерфейснаясекция содержит объявление ресурсов (в том числе заголовки подпрограмм), к которым возможны обращения извне.

Секция реализации содержит описание подпрограмм, объявленных в интерфейсной секции, и описание внутренних ресурсов модуля (локальных переменных, типов, подпрограмм). Обращение к этим ресурсам возможно только из подпрограмм, описанных в том же модуле.

Секция инициализации содержит операторы, которые выполняют некоторые действия, необходимые для нормальной работы процедур модуля (например, открывают файлы, инициализируют некоторые переменные и т.п.). Операторы секции инициализации выполняются один раз (при подключении модуля) до начала выполнения основной программы. Эта секция в модуле может отсутствовать.

Программа, которая использует ресурсы нескольких модулей, должна в области описаний содержать спецификацию используемых модулей:

В спецификации uses необходимо указывать только те модули, ресурсы которых данная программная единица (программа или модуль) использует непосредственно. Если подключаемый модуль использует другие модули, то их подключение уже описано в нем. Секции инициализации подсоединяемых модулей выполняются в порядке их подключения.

Пример 5.4. Разработать модуль, содержащий подпрограмму суммирования элементов массива.

Разбиваем текст программы примера 5.2 на две части: подпрограмму размещаем в модуле, а тестирующую программу оставляем в качестве основной программы. Так как все структурные типы параметров должны быть предварительно объявлены, описываем тип массива в модуле.

Программа использует из модуля два ресурса: описание типа mas для объявления массива А и функцию Sum.

Все ресурсы, объявленные в интерфейсной части модуля, доступны в основной программе. В случаях перекрытия имен, когда основная программа и подключенный модуль содержат ресурсы с одинаковыми именами, при обращении к ресурсам модуля используют составные имена

<имя модуля>.<имя ресурса>.

Например, в модуле описана переменная X:

А в основной программе, которая использует этот модуль, объявлена собственная переменная X:

В виде модулей в Borland Pascal реализованы библиотеки подпрограмм, использование которых существенно упрощает разработку программ.

Вместе с системой программирования на Borland Pascal поставляются следующие библиотеки:

· System - основная библиотека - содержит описания всех стандартных процедур и функций, таких, как математические функции, функции преобразований, процедуры и функции обработки строк и т.п. Ресурсы данной библиотеки доступны любой программе без специального указания.

· Crt - библиотека управления экраном в текстовом режиме - содержит описание переменных, констант и процедур и функций, обеспечивающих управление экраном, клавиатурой и динамиком.

· Graph - библиотека управления экраном в графическом режиме - содержит описание переменных, констант и процедур и функций, обеспечивающих управление экраном в графическом режиме.

· Dos - библиотека организации взаимодействия с операционной системой MS DOS - содержит описание процедур и функций, обеспечивающих обращение к функциям операционной системы.

Примечание. Следует иметь в виду, что модули System, Crt, Dos, Printer объединены в файл Turbo.tpl, а модуль Graph поставляется отдельно в виде файла Graph.tpu.

При разработке собственных библиотек программисты стремятся создавать подпрограммы, имеющие широкую область применения, для чего используют специальные средства объявления параметров: открытые массивы и строки, нетипизированные параметры и параметры процедурного типа.



2015-12-14 563 Обсуждений (0)
Передача данных через параметры 0.00 из 5.00 0 оценок









Обсуждение в статье: Передача данных через параметры

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (563)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)