Инструменты пользователя

Инструменты сайта


bb:redbook:107

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
bb:redbook:107 [2017/04/06 22:07]
иван_денисов
bb:redbook:107 [2017/08/30 14:28]
prospero78 [5. Вызов процедуры с параметрами]
Строка 7: Строка 7:
 Процедура в **КП** (впрочем, как и в любом **ЯП**) — это маленькая программа, работающая в интересах всей программы, причём, обычно, когда процедура получает управление, основная программа ждёт результатов её работы((Основная программа на современных компьютерах может не ждать, пока подпрограмма выполняется (если это требует много времени). Если такая подпрограмма выполняется в потоке главной программы она называется //сопрограмма// или //легковесный поток// (при этом может останавливать выполнение основной программы). Если в состав компьютера входит множество вычислительных узлов, то такая подпрограмма называется //процесс//.Подробнее смотрите в [[https://ru.wikipedia.org/wiki/Green_threads|Википедии]])). Поэтому нет ничего удивительного в том, что оформление процедуры очень похоже на оформление модуля: Процедура в **КП** (впрочем, как и в любом **ЯП**) — это маленькая программа, работающая в интересах всей программы, причём, обычно, когда процедура получает управление, основная программа ждёт результатов её работы((Основная программа на современных компьютерах может не ждать, пока подпрограмма выполняется (если это требует много времени). Если такая подпрограмма выполняется в потоке главной программы она называется //сопрограмма// или //легковесный поток// (при этом может останавливать выполнение основной программы). Если в состав компьютера входит множество вычислительных узлов, то такая подпрограмма называется //процесс//.Подробнее смотрите в [[https://ru.wikipedia.org/wiki/Green_threads|Википедии]])). Поэтому нет ничего удивительного в том, что оформление процедуры очень похоже на оформление модуля:
 <code oberon2> <code oberon2>
-PROCEDURE Start;+PROCEDURE Старт;
 BEGIN BEGIN
- Log.String('Привет, мир!'); + мЛог.String('Привет, мир!'); 
- Log.Ln + мЛог.Ln 
-END Start;+END Старт;
 </code> </code>
      
  
-Это та самая процедура, которая уже встречалась в примере "HelloWorld!".+Это та самая процедура, которая уже встречалась в примере "Приветмир!".
  
 Процедура объявляется ключевым словом ''PROCEDURE'', после которого следует само имя процедуры, заканчивается объявление процедуры — точкой с запятой. Как было описано раньше, по соглашению принятому в **КП** — имена процедур начинаются с большой буквы. Процедура объявляется ключевым словом ''PROCEDURE'', после которого следует само имя процедуры, заканчивается объявление процедуры — точкой с запятой. Как было описано раньше, по соглашению принятому в **КП** — имена процедур начинаются с большой буквы.
Строка 25: Строка 25:
 Как было описано в одном из предыдущих разделов, после последней инструкции в теле процедуры — перед ''END'' — точку с запятой ставить не нужно. Как было описано в одном из предыдущих разделов, после последней инструкции в теле процедуры — перед ''END'' — точку с запятой ставить не нужно.
 ==== 3. Процедура без параметров ==== ==== 3. Процедура без параметров ====
-Параметром называется какая-либо переменная, которая передаётся в процедуру. Процедура, которая определена без параметров (например, ''Start'') называется "процедурой без параметров".+Параметром называется какая-либо переменная, которая передаётся в процедуру. Процедура, которая определена без параметров (например, ''Старт'') называется "процедурой без параметров".
  
 Такие процедуры встречаются не часто. И использование таких процедур хоть и возможно в **КП**, но не приветствуется. Как правило такие процедуры используют переменные, объявленные //в других местах//. Изменение этих переменных таким способом //нарушает// принцип //разделения и сокрытия информации//, что приводит к //снижению// надёжности программ.  Такие процедуры встречаются не часто. И использование таких процедур хоть и возможно в **КП**, но не приветствуется. Как правило такие процедуры используют переменные, объявленные //в других местах//. Изменение этих переменных таким способом //нарушает// принцип //разделения и сокрытия информации//, что приводит к //снижению// надёжности программ.
Строка 38: Строка 38:
  
 <code oberon2> <code oberon2>
-MODULE TestHello03;+MODULE КнигаПривет3;
  (* это третья программа на языке  (* это третья программа на языке
  Компонентный Паскаль. Она выполняет  Компонентный Паскаль. Она выполняет
Строка 44: Строка 44:
  показывает как использовать процедуры *)  показывает как использовать процедуры *)
  
- IMPORT Log;+ IMPORT мЛог := Log; 
  CONST  CONST
- = 2;+ _конст = 2; 
  VAR  VAR
- i: INTEGER; + цПерем: INTEGER; 
- i1: REAL;+ вПерем: REAL;
  
- PROCEDURE LogReal (r: REAL);+ PROCEDURE Вещ_Печать (пвПерем: REAL);
  VAR  VAR
  BEGIN  BEGIN
- Log.Real(r); + мЛог.Real(пвПерем); 
- Log.Ln + мЛог.Ln 
- END LogReal;+ END Вещ_Печать;
  
- PROCEDURE Start*;+ PROCEDURE Старт*;
  VAR  VAR
  BEGIN  BEGIN
- := 3; + цПерем := 3; 
- i1 := i+ вПерем := _конст цПерем
- Log.String('Привет, мир!'); Log.Ln; + мЛог.String('Привет, мир!'); мЛог.Ln; 
- LogReal(i1+ Вещ_Печать(вПерем
- END Start;+ END Старт;
  
 BEGIN BEGIN
-END TestHello03.+END КнигаПривет3.
 </code>  </code> 
   
-Этот вариант программы делает всё тоже самое, что и предыдущая, но с использованием дополнительной процедуры ''LogReal'' описанной выше. Передаваемый аргумент ''i1'' должен иметь тот же тип, что и требуемый параметр в объявлении процедуры. В противном случае, **КП** посчитает это ошибкой. Теперь вместо двух инструкций ''Log.Real(i1); Log.Ln'' можно писать только одну, что приводит к сокращению набираемого кода. В этом примере заключается одна из ключевых идей процедурного стиля. Но обратите внимание, что для вызова процедуры компьютеру требуется выполнить ряд дополнительный служебных действий, и при возврате из процедуры также выполняются некоторые действия, что приводит к дополнительным небольшим затратам времени. Поэтому, //вызов процедуры должен быть оправдан//. Само тело процедуры не должно состоять из одной инструкции, так как в этом //нет никакого смысла//.+Этот вариант программы делает всё тоже самое, что и предыдущая, но с использованием дополнительной процедуры ''Вещ_ Печать'' описанной выше. Передаваемый аргумент ''вПерем'' должен иметь тот же тип, что и требуемый параметр в объявлении процедуры. В противном случае, **КП** посчитает это ошибкой. Теперь вместо двух инструкций ''мЛог.Real(вПерем); Log.Ln'' можно писать только одну, что приводит к сокращению набираемого кода. В этом примере заключается одна из ключевых идей процедурного стиля. Но обратите внимание, что для вызова процедуры компьютеру требуется выполнить ряд дополнительный служебных действий, и при возврате из процедуры также выполняются некоторые действия, что приводит к дополнительным небольшим затратам времени. Поэтому, //вызов процедуры должен быть оправдан//. Само тело процедуры не должно состоять из одной инструкции, так как в этом //нет никакого смысла//.
  
-Ещё один момент на который необходимо обратить внимание — это порядок размещения процедур. Если процедуру ''LogReal'' разместить позже процедуры ''Start'' компилятор **КП** не сможет понять, что за процедуру вызывает инструкция ''LogReal(i1)''. Компиляция завершится ошибкой. Поэтому, объявление процедур должно быть упреждающим.+Ещё один момент на который необходимо обратить внимание — это порядок размещения процедур. Если процедуру ''Вещ Печать'' разместить позже процедуры ''Старт'' компилятор **КП** не сможет понять, что за процедуру вызывает инструкция ''Вещ_Печать(вПерем)''. Компиляция завершится ошибкой. Поэтому, объявление процедур должно быть упреждающим.
   
 ==== 6. Возврат значения из процедуры ==== ==== 6. Возврат значения из процедуры ====