pascalabcnet/PABCNetHelp/LangGuide/ProcFunc/params.html

113 lines
5.3 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="var">
<param name="Keyword" value="const">
<param name="Keyword" value="Формальные параметры">
<param name="Keyword" value="Фактические параметры">
<param name="Keyword" value="Передача параметра по значению">
<param name="Keyword" value="Передача параметра по ссылке">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
<link rel="StyleSheet" href="../../default.css">
</head>
<body>
<H1>Параметры процедур и функций</H1>
<p class="pabcmain">Параметры, указываемые при описании
подпрограммы, называются <b><font color="#FF0000"> <i>формальными</i></font></b>. Параметры, указываемые при вызове
подпрограммы, называются <i><b><font color="#FF0000">фактическими</font></b></i>.</p>
<p class="pabcmain">Если формальный параметр описан с
предваряющим ключевым словом <code>
<b>var</b></code> или <code><b>const</b></code>, то его называют <i><b><font color="#FF0000">параметром-переменной</font></b></i> и говорят, что
он передается <i><b><font color="#FF0000">по ссылке</font></b></i>. Если же
параметр описан без слов <code><b>var</b></code> или <code><b>const</b></code>,
то его называют <i><b><font color="#FF0000">параметром-значением</font></b></i> и говорят, что он передается <i>
<b><font color="#FF0000">по
значению</font></b></i>. Слово ссылка используется в PascalABC.NET также в
другом значении - для <a href="../Types/value_ref_types.html">ссылочных типов</a>.</p>
<p>Если параметр передается по значению, то при вызове
подпрограммы значения фактических параметров присваиваются соответствующим
формальным параметрам. Типы фактических параметров-значений должны быть
<a href="../Types/typecompatibility.html">совместимы по присваиванию</a> с типами
соответствующих формальных параметров. </p>
<p>Например, пусть имеется следующее описание процедуры:</p>
<blockquote>
<code><b>procedure</b> PrintSquare(i: integer);<br>
<b>begin</b><br>
&nbsp; writeln(i*i);<br>
<b>end</b>;</code></blockquote>
Тогда при вызове <code>PrintSquare(5*a-b)</code> значение <code>5*a-b</code> будет вычислено и присвоено переменной <code>i</code>, после чего
выполнится тело процедуры.<p class="pabcmain">Если параметр передается по ссылке, то при вызове
подпрограммы фактический параметр заменяет собой в теле процедуры
соответствующий ему формальный параметр. В итоге любые изменения формального
параметра-переменной внутри процедуры приводят к соответствующим изменениям
фактического параметра. Фактические параметры-переменные должны быть
переменными, а их типы должны быть <a href="../Types/typecompatibility.html">
эквивалентны</a> типам соответствующих формальных параметров.</p>
<p class="pabcmain">Например, если описана процедура</p>
<blockquote>
<code><b>procedure</b> Mult2(<b>var</b>
a: integer);<br>
<b>begin</b><br>
&nbsp; a := a*2;<br>
<b>end</b>;</code></blockquote>
то после вызова <code>Mult2(d)</code> значение <code>d</code> увеличится в 2 раза.<p>В качестве фактического параметра-значения можно указывать
любое выражение, тип которого совпадает с типом формального параметра или неявно
к нему приводится.&nbsp; В качестве фактического параметра-переменной можно
указывать только переменную, тип которой в точности совпадает с типом
формального параметра.&nbsp; </p>
<p>При передаче параметра по ссылке в подпрограмму передается адрес фактического
параметра. Поэтому если параметр занимает много памяти (массив, запись, строка), то
обычно он также передается по ссылке. В результате в процедуру передается не сам
параметр, а его адрес, что экономит память и время работы. При этом если
параметр меняется внутри подпрограммы, то он передается с ключевым словом <code>
<b>var</b></code>, если не меняется - с ключевым словом <code><b>const</b></code>:</p>
<p>Например:</p>
<blockquote>
<code><b>type <br>
</b>&nbsp; Person = <b>record</b><br>
&nbsp;&nbsp;&nbsp; name: string;<br>
&nbsp;&nbsp;&nbsp; age,height,weight: integer;<br>
&nbsp; <b>end</b>;</code><p><code><b>procedure</b> Print(<b>const</b> p: Person);<br>
<b>begin<br>
</b>&nbsp; write(p.name,' ',p.age,' ',p.height,' ',p.weight);<br>
<b>end</b>;</code></p>
<p><code><b>procedure</b> IncAge(<b>var</b> p: Person);<br>
<b>begin</b><br>
&nbsp; Inc(p.age);<br>
<b>end</b>;</code></p>
</blockquote>
<p>Отметим особенности передачи динамических массивов в
качестве параметров подпрограмм. </p>
<p>Поскольку динамический массив является ссылкой, то при
изменении формального параметра-динамического массива внутри подпрограммы
меняется соответствующий фактический параметр. Например,
в результате работы программы </p>
<blockquote>
<p><code><b>procedure</b> p(a: <b>array</b> <b>of</b> integer);<br>
<b>begin</b><br>
&nbsp; a[1] := 2;<br>
<b>end</b>;</code></p>
<p><code><b>var</b> b: <b>array</b> <b>of</b> integer := (1,1);</code></p>
<p><code><b>begin</b><br>
&nbsp; p(b);<br>
&nbsp; writeln(b[1]);<br>
<b>end</b>.</code></p>
</blockquote>
<p>будет выведено 2. Передавать динамические массивы по ссылке
имеет смысл только в случае если память под динамический массив
перераспределяется внутри подпрограммы: </p>
<blockquote>
<p><code><b>procedure</b> q(<b>var</b> a: <b>array</b> <b>of</b> integer);<br>
<b>begin</b><br>
&nbsp; SetLength(a,10);<br>
<b>end</b>;</code></p>
</blockquote>
</body>
</html>