2018-08-02 22:04:49 +03:00
|
|
|
|
<html>
|
|
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
|
|
|
|
|
<param name="Keyword" value="var">
|
|
|
|
|
|
<param name="Keyword" value="const">
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<param name="Keyword" value="Формальные параметры">
|
|
|
|
|
|
<param name="Keyword" value="Фактические параметры">
|
|
|
|
|
|
<param name="Keyword" value="Передача параметра по значению">
|
|
|
|
|
|
<param name="Keyword" value="Передача параметра по ссылке">
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</object>
|
|
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
|
|
|
|
|
<title></title>
|
|
|
|
|
|
<link rel="StyleSheet" href="../../default.css">
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<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>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> PrintSquare(i: integer);<br>
|
|
|
|
|
|
<b>begin</b><br>
|
2025-11-11 22:04:03 +03:00
|
|
|
|
Println(i*i);<br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b>end</b>;</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
Тогда при вызове <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>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> Mult2(<b>var</b>
|
|
|
|
|
|
a: integer);<br>
|
|
|
|
|
|
<b>begin</b><br>
|
|
|
|
|
|
a := a*2;<br>
|
|
|
|
|
|
<b>end</b>;</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
то после вызова <code>Mult2(d)</code> значение <code>d</code> увеличится в 2 раза.<p>В качестве фактического параметра-значения можно указывать
|
|
|
|
|
|
любое выражение, тип которого совпадает с типом формального параметра или неявно
|
|
|
|
|
|
к нему приводится. В качестве фактического параметра-переменной можно
|
|
|
|
|
|
указывать только переменную, тип которой в точности совпадает с типом
|
|
|
|
|
|
формального параметра. </p>
|
|
|
|
|
|
<p>При передаче параметра по ссылке в подпрограмму передается адрес фактического
|
|
|
|
|
|
параметра. Поэтому если параметр занимает много памяти (массив, запись, строка), то
|
|
|
|
|
|
обычно он также передается по ссылке. В результате в процедуру передается не сам
|
|
|
|
|
|
параметр, а его адрес, что экономит память и время работы. При этом если
|
|
|
|
|
|
параметр меняется внутри подпрограммы, то он передается с ключевым словом <code>
|
|
|
|
|
|
<b>var</b></code>, если не меняется - с ключевым словом <code><b>const</b></code>:</p>
|
|
|
|
|
|
<p>Например:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>type <br>
|
|
|
|
|
|
</b> Person = <b>record</b><br>
|
|
|
|
|
|
name: string;<br>
|
|
|
|
|
|
age,height,weight: integer;<br>
|
2025-11-11 22:04:03 +03:00
|
|
|
|
<b>end</b>;</code><p><code><b>procedure</b> PrintPupil(<b>const</b> p: Person);<br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b>begin<br>
|
2025-11-11 22:04:03 +03:00
|
|
|
|
</b> Print(p.name,p.age,p.height,p.weight);<br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b>end</b>;</code></p>
|
|
|
|
|
|
<p><code><b>procedure</b> IncAge(<b>var</b> p: Person);<br>
|
|
|
|
|
|
<b>begin</b><br>
|
|
|
|
|
|
Inc(p.age);<br>
|
|
|
|
|
|
<b>end</b>;</code></p>
|
|
|
|
|
|
</blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Отметим особенности передачи динамических массивов в
|
|
|
|
|
|
качестве параметров подпрограмм. </p>
|
|
|
|
|
|
<p>Поскольку динамический массив является ссылкой, то при
|
|
|
|
|
|
изменении формального параметра-динамического массива внутри подпрограммы
|
|
|
|
|
|
меняется соответствующий фактический параметр. Например,
|
|
|
|
|
|
в результате работы программы </p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<p><code><b>procedure</b> p(a: <b>array</b> <b>of</b> integer);<br>
|
|
|
|
|
|
<b>begin</b><br>
|
|
|
|
|
|
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>
|
|
|
|
|
|
p(b);<br>
|
|
|
|
|
|
writeln(b[1]);<br>
|
|
|
|
|
|
<b>end</b>.</code></p>
|
|
|
|
|
|
</blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>будет выведено 2. Передавать динамические массивы по ссылке
|
|
|
|
|
|
имеет смысл только в случае если память под динамический массив
|
|
|
|
|
|
перераспределяется внутри подпрограммы: </p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<p><code><b>procedure</b> q(<b>var</b> a: <b>array</b> <b>of</b> integer);<br>
|
|
|
|
|
|
<b>begin</b><br>
|
|
|
|
|
|
SetLength(a,10);<br>
|
|
|
|
|
|
<b>end</b>;</code></p>
|
|
|
|
|
|
</blockquote>
|
|
|
|
|
|
</body>
|
|
|
|
|
|
|
|
|
|
|
|
</html>
|