28619

Процедуры с ближним и дальним адресом вызова

Доклад

Информатика, кибернетика и программирование

Возможность создавать опережающее описание для процедур позволяет решить следующую проблему: предположим в некоторой программе Вы используете две процедуры с именами Proc1 и Proc2 причем процедура Proc1 использует вложенную процедуру Proc2 а процедура Proc2 в свою очередь использует процедуру Proc1. Поскольку Вы не можете использовать не объявленную ранее процедуру то у Вас возникает проблема связанная с необходимостью развязать зацикленные друг на друга процедуры Proc1 и Proc2. Использование директивы Forward при объявлении процедуры...

Русский

2013-08-20

21.13 KB

0 чел.

Описание процедуры, содержащее вместо блока операторов директиву Forward, называют опережающим описанием.

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

Возможность создавать "опережающее описание" для процедур позволяет решить следующую проблему: предположим, в некоторой программе Вы используете две процедуры с именами Proc1 и Proc2, причем процедура Proc1 использует вложенную процедуру Proc2, а процедура Proc2, в свою очередь, использует процедуру Proc1. Поскольку Вы не можете использовать не объявленную ранее процедуру, то у Вас возникает проблема, связанная с необходимостью развязать "зацикленные" друг на друга процедуры Proc1 и Proc2. Использование директивы Forward при объявлении процедуры Proc1 позволяет решить эту проблему.

Program Primer;
. . .

Procedure Proc1 (список формальных параметров); Forward;{заголовок первой процедуры}
Procedure Proc2 (список параметров); {заголовок второй процедуры}
Begin{Основной блок процедуры Proc2}
  . . .
  Proc1 (список фактических параметров); {Вызов процедуры Proc1}
 
  . . .
End;

Procedure Proc1 (список параметров);
 
Begin{Основной блок процедуры Proc1}
  . . .
  Proc2 (список фактических параметров); {Вызов процедуры Proc2}
 
  . . .
End;

Begin
  . . . {Тело основной программы}
End.

Процедуры с ближним и дальним адресом вызова

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

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

Компилятор на основе составленного описания процедуры может автоматически выбирать оптимальную модель вызова. Если же при разработке программы возникла необходимость задать данной процедуре конкретную модель вызова, то в описании данной процедуры перед ее основным блоком необходимо указать директиву Near или Far.

Параметры-процедуры и параметры-функции

Турбо Паскаль позволяет рассматривать функции и процедуры как объекты, которые можно присвоить переменным и которые могут выступать в качестве параметров.

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

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

Процедуры и функции должны быть объявлены с директивой Far (использование дальнего типа вызова подпрограмм) и откомпилированы в состоянии {$F+}. А также они не должны быть:

  1.  стандартной подпрограммой;
  2.  вложенной подпрограммой;
  3.  Inline процедурой или функцией (подпрограммы, записанные в машинных кодах);
  4.  Interrupt процедурой или функцией (подпрограммы обработки прерываний).

При использовании параметров-процедур или параметров-функций в списке перед соответствующими формальными параметрами указывается зарезервированное слово Procedure или Function.

Например,

Procedure Example(k,l : integer; Var M : real; Procedure Prob; Function Step : real);

В списке формальных параметров процедуры Example:

k, l - параметры-значения;
M - параметр-переменная;
Prob - параметр-процедура;
Step - параметр-функция.

При вызове подпрограммы на место формальных параметров-процедур и параметров-функций осуществляется подстановка соответствующих фактических процедур или функций.

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

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

Program ProcType;
Type
  Func=Function(x, y : integer) : integer;{
Описание процедурного типа}
{
Extra close braceF-}
Procedure Tab(w,h : integer; Operation : Func);
Var
  x, y : integer;
Begin
  for y := 1 to w do
    begin
      for x := 1 to h do
        write(Operation(x,y):5);
      writeln;
    end;
End;

Begin
  Tab(10,10,Add);
  writeln;
  Tab(10,10,Mult);
  writeln;
  Tab(10,10,Funny);
End.

В данной программе процедура Tab представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска программы сначала вызывается процедура Tab для фактических параметров 10, 10 и Add, в результате чего формальным параметрам w и h присваиваются значения  10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет выведена таблица сложения от 1 до 10. Затем процедура Tab вызывается к исполнению для фактических параметров 10, 10 и параметра-функции Mult, в результате этого на экран будет выведена таблица умножения от 1 до 10. Аналогично вызов процедуры Tab с параметрами 10, 10 и Funny даст в результате на экране таблицу произведения суммы на разность чисел от 1 до 10.

Задание. Введите текст этой программы, запишите полученный файл на диск и откомпилируйте его. После того как компиляция выполнится успешно, исполните программу в пошаговом режиме с заходом в процедуры и пронаблюдайте за вызовом функций вычисления суммы, произведения двух чисел или произведения их суммы и разности. Обратите внимание на то, как при исполнении оператора write(Operation(x,y):5) в зависимости от фактического значения параметра-функции Operation процедурного типа Func осуществляется вызов различных функций Add, Mult или Funny. Попробуйте удалить строку с директивой компилятору об использовании дальнего типа вызова или возьмите в фигурные скобки описание процедурного типа Func и пронаблюдайте за результатом. В случае появления ошибок нажатием клавиши F1 получите справку о причинах ошибки и рекомендацию по ее исправлению.

Модули, созданные программистом

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

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

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

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

Модуль можно разделить на несколько разделов: заголовок, интерфейсная часть, реализационная часть, инициализационная часть.

Заголовок модуля

Unit <Имя модуля>;
{$N+} <Глобальные директивы компилятора>;

Интерфейсная часть

Interface
  Uses<список подключаемых модулей>;
  Const<описания констант, определенных в данном модуле и доступных для других модулей>;
  Type<описания типов, определенных в данном модуле и доступных для других модулей>;
  Var<описания переменных, определенных в данном модуле и доступных для других модулей>;
  Procedure<Заголовки процедур, определенных в данном модуле и доступных для других модулей>;
  Function<Заголовки функций, определенных в данном модуле и доступных для других модулей>;

Реализационная часть

Implementatoin
  Uses<список подключаемых модулей>;
  Const<описания констант, определенных в данном модуле и недоступных для других модулей>;
  Type<описания типов, определенных в данном модуле и недоступных для других модулей>;
  Var<описания переменных, определенных в данном модуле и недоступных для других модулей>;
  Procedure<реализация процедур, определенных в данном модуле и доступных для других модулей>;
  Function<реализация функций, определенных в данном модуле и доступных для других модулей>;
  Procedure<реализация процедур, определенных в данном модуле и недоступных для других модулей>;
  Function<реализация функций, определенных в данном модуле и недоступных для других модулей>;
 

Инициализационная часть

Begin <Слово Begin необходимо, если имеются операторы в данной части программы>
  <часть модуля, исполняемая при его подключении (необязательна)>
End.

Заголовок модуля

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

При выборе имени модуля необходимо учитывать одну особенность: имя модуля должно совпадать с именем файла, в котором он хранится, а значит, имя модуля не может состоять более чем из 8 символов. А также не забывайте, что имя не должно совпадать с именами объектов (процедур, функций и др.).

Интерфейсная часть

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

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

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

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

Примечание. Интерфейсная часть может быть пуста.

Реализационная часть

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

Реализационная часть также может быть пустой.

Инициализационная часть

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


 

А также другие работы, которые могут Вас заинтересовать

32330. Форма государственного устройства как элемент формы государства. Понятие, виды, характеристика отдельных видов 33.5 KB
  Форма государственного устройства как элемент формы государства. Форма государственного устройства это элемент формы государства характеризующий внутреннюю структуру государства способ его политического и территориального деления обусловливающий определенные взаимоотношения органов всего государства с органами его составных частей. Взимание местных налогов как правило допускается с санкции государства. Территории в отличие от государства не вправе по своему усмотрению устанавливать и взимать налоги.
32331. Политический режим как элемент формы государства. Понятие режима. Виды режимов. Демократия как режим государства. Ее значение и виды. Антидемократические режимы и их виды 62 KB
  Политический государственный режим это система методов способов и средств осуществления политической власти. По мнению других авторов понятие политический режим более широкое чем понятие государственный режим поскольку включает в себя методы и приемы осуществления политической власти не только со стороны государства но и со стороны политических партий и движений общественных объединений организаций и т. Если первая показывает весь комплекс институтов участвующих в политической жизни общества и в осуществлении политической...
32332. Политическая система общества. Ее понятие, структура, типы. Характеристика отдельных типов политических систем 46.5 KB
  Выделяют следующие компоненты политической системы: 1 политическая организация общества включающая в себя государство политические партии и движения общественные организации и объединения трудовые коллективы и т.; 2 политическое сознание характеризующее психологические и идеологические стороны политической власти и политической системы; 3 социальнополитические и правовые нормы регулирующие политическую жизнь общества и процесс осуществления политической власти; 4 политические отношения складывающиеся между элементами системы...
32333. Место и роль государства и права в политической системе общества 33.5 KB
  Место и роль государства и права в политической системе общества Понятия государство и политическая система общества соотносятся как часть и целое. Государство концентрирует в себе все многообразие политических интересов регулируя явления политической жизни через призму общеобязательности. Именно в этом качестве государство играет особую роль в политической системе придавая ей своего рода целостность и устойчивость. Государство занимает центральное ведущее положение в политической системе общества так как оно: 1 выступает в качестве...
32334. Понятие и роль социальных норм. Деление их на обычаи, нравственные, правовые, корпоративные. Взаимосвязь правовых и иных социальных норм. Другие основания классификации социальных норм 55 KB
  Важнейшим средством организации общественных отношений являются социальные нормы: нормы права нормы морали нормы общественных организаций нормы традиций обычаев и ритуалов. Эти нормы обеспечивают наиболее целесообразное и гармоничное функционирование общества в соответствии с потребностями его развития. Социальные нормы это правила регулирующие поведение людей и деятельность организаций в их взаимоотношениях. Социальные нормы характеризуются рядом признаков: 1.
32335. Сущность права, признаки права и определение его понятия на основе нормативного подхода. Иные подходы к определению понятия права 43.5 KB
  Сущность права признаки права и определение его понятия на основе нормативного подхода. Иные подходы к определению понятия права. Специфика права проявляется в его признаках которые содержатся в приведенном выше определении. Эти признаки заключаются в следующем: 1 право носило волевой характер ибо оно есть проявление воли и сознания людей но не любой воли а прежде всего государственно выраженной воли классов социальных групп элит большинства членов общества; 2 общеобязательность в чем воплощается суверенитет государства...
32336. Характеристика права с позиции естественно-правовой, исторической, психологической, социологической школы. Их оценка. Соотношение права и закона в различных концепциях 43.5 KB
  Характеристика права с позиции естественноправовой исторической психологической социологической школы. Соотношение права и закона в различных концепциях. Становление права есть процесс и результат целенаправленной деятельности человека включающий в себя познание права его восприятие оценку и отношение к нему как к целостному социальному явлению. Учитывая такой плюрализм мнений и сложную природу самого права И.
32337. Право и нравственность (мораль) в современных условиях. Их единство, различие и взаимодействие. Возможные противоречия и пути преодоления 46 KB
  Поэтому не все ученые считают нормы нравственности явлением исключительно социальным. Человек как бы извлекает из себя нормы своего поведения в себе в глубине своей души дает оценку своим действиям. Согласно ей нормы морали имеют двоякую природу: одни имеют в виду самого индивида другие отношение индивида к обществу. Другие же категорически утверждают что нормы нравственности это требования обращенные к человеку извне.
32338. Правовая система. Понятие, элементы, их характеристика. Правовая система и правовое регулирование 48 KB
  В отечественной юриспруденции вопросы правовой системы общества стали интенсивно разрабатываться в конце 1970х начале 1980х годов. Другими словами возникла насущная потребность в синтезе правовой мысли в объединении накопленных знаний и создании целостной системной картины правового регулирования. Понятие правовая система должно быть результатом системного подхода ко всей правовой действительности как к единому объекту результатом проекции на правовую действительность системных категорий прежде всего понятия система . В итоге такого...