<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=57334&amp;view=findpost&amp;p=383065</guid>
        <pubDate>Thu, 17 Jun 2004 19:50:31 +0000</pubDate>
        <title>Процедурные и функциональные типы</title>
        <link>https://forum.sources.ru/index.php?showtopic=57334&amp;view=findpost&amp;p=383065</link>
        <description><![CDATA[e-moe: <div class='tag-align-center'><span class='tag-size' data-value='11' style='font-size:11pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>Процедурные и функциональные типы и переменные.</strong></span></span></div><br>
<br>
Если в программе требуется несколько раз определить интеграл для различных функций, то в этом случае вычисление интеграла выполняют в виде подпрограммы, а при обращении к ней указывают имя конкретной функции f(x). Тогда имя функции играет роль параметра, следовательно, если имеются <span class="tag-color tag-color-named" data-value="orange" style="color: orange">функциональные параметры</span>, то должны быть также <span class="tag-color tag-color-named" data-value="orange" style="color: orange">функциональные типы, переменные и константы</span>.<br>
<br>
    Описание процедурного (функционального) типа имеет вид заголовка процедуры (функции), но без имени процедуры (функции).<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProcType1 = procedure;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProcType2 = procedure(a: real);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProcType3 = procedure(Var x: real; m,n: byte);</div><div class="code_line">&nbsp;&nbsp; &nbsp;FuncType1 = function: real;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FuncType2 = function(x: real): real;</div><div class="code_line">Var &nbsp; &nbsp;P1,P2 : ProcType3;</div><div class="code_line">&nbsp;&nbsp; &nbsp;F1,F2 : FuncType2;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Имена переменных в описании типа процедур и функций играет чисто иллюстративную роль.<br>
<br>
<em class='tag-i'>Процедурные и функциональные константы – это имена конкретных процедур и функций.</em><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Proc1(y,m,k);</div><div class="code_line">&nbsp;&nbsp; &nbsp;P1:=Proc1; &nbsp; &nbsp;{ процедурной переменной P1 присваивается процедурная константа Proc1 }</div><div class="code_line">&nbsp;&nbsp; &nbsp;P1(y,m,k)</div><div class="code_line">End;</div></ol></div></div></div></div><br>
Обращение <strong class='tag-b'>Proc1(y,m,k)</strong> тождественно <strong class='tag-b'>P1(y,m,k)</strong>.<br>
Процедурная или функциональная переменная это указатель, который определяет адрес точки входа конкретной процедуры или функции, следовательно, процедурные (функциональные) переменные занимают 4 байта памяти.<br>
<br>
<span class="tag-color tag-color-named" data-value="purple" style="color: purple">Присваивание процедурной (функциональной) переменной конкретного значения определяется общими правилами, т.е. ей можно присвоить значение другой процедурной (функциональной) переменной или значение процедурной (функциональной) константы того же типа.<br>
<br>
Адреса в программе могут быть полными и короткими, в частности локальные переменные всегда имеют краткий адрес. Краткий адрес – это одно смещение (без сегмента) т.е. 2 байта. Использование кратких адресов существенно экономит память программы.<br>
<br>
Процедурные константы так же могут иметь полный или краткий адрес. Те процедуры, имена которых в интерфейсной части (<strong class='tag-b'>Interface </strong>в модулях) – всегда имеют полный адрес, а части реализации (<strong class='tag-b'>Implementation </strong>в модулях) могут иметь как полный, так и краткий адрес. Внутренние (вложенные) процедуры всегда имеют краткий адрес. Если процедурной (функциональной) переменной присваивается значение процедурной (функциональной) константы, то такая константа должна иметь полный адрес.</span><br>
<br>
<span class='tag-u'>При использовании конкретных процедур в качестве процедурных констант должны выполняться следующие требования:</span><br>
<ol class="tag-list" type="1"><li>Процедура (функция) должна компилироваться с директивой <strong class='tag-b'>{F+}</strong>, которая обеспечивает генерацию полного адреса или сразу после ее заголовка должна идти стандартная директива <strong class='tag-b'>FAR;</strong>.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{$F+}</div><div class="code_line">Function F1: real;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">End;</div><div class="code_line">{$F-}</div></ol></div></div></div></div><br>
или<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Function F1: real; far;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">End;</div></ol></div></div></div></div></li><li>Это не должна быть внутренняя процедура (функция) т.е. она не должна быть вложенной.</li><li>Это не должны быть процедуры и функции объекта. (спасибо <strong class='tag-b'>ZenIA</strong>)</li><li>Если это стандартная процедура (функция), то для нее должна быть выполнена процедурная оболочка.</li></ol><br>
<em class='tag-i'><span class="tag-color tag-color-named" data-value="orange" style="color: orange">Стандартными</span> считаются процедуры и функции, которые не требуют программной реализации (например, процедуры и функции модуля <strong class='tag-b'>system</strong>).</em><br>
    Некоторые стандартные процедуры могут иметь аргументы разного типа, а так же переменное количество аргументов. Например, <strong class='tag-b'>sin(x)</strong> – вещественный или целый тип, <strong class='tag-b'>write </strong>– произвольное количество аргументов разного типа.<br>
    Процедурная (функциональная) оболочка обеспечивает единственность аргументов в процедуре (функции).<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Function SinReal(const x: real): real;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;SinReal:=sin(const x)</div><div class="code_line">End; { SinReal }</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure WriteLnStr(const s: string);</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteLn(const s)</div><div class="code_line">End; { WriteLnStr }</div></ol></div></div></div></div><br>
Пример численного интегрирования двух разных функций в одной процедуре смотрите в прикрепленном файле.<br>
<br>
<strong class='tag-b'>Текст составлен по мотивам лекций по Turbo Pascal Назаренко В.И.</strong>]]></description>
        <author>e-moe</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	