/
n-dimens
/
pascalabcnet
Обзор
Документация
Войти
/
n-dimens
/
pascalabcnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
PABCNetHelp/LangGuide/ProcFunc/params.html
112 строк
8 KB
samuraiGH
adding working-tree-encoding attribute (#3325)
07 ноя 2025, 16:12
Не верифицирован
07 ноя 2025, 16:12
cf1fd29
Код
Авторство
О чём код?
<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> 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> a := a*2;<br> <b>end</b>;</code></blockquote> то после вызова <code>Mult2(d)</code> значение <code>d</code> увеличится в 2 раза.<p>В качестве фактического параметра-значения можно указывать любое выражение, тип которого совпадает с типом формального параметра или неявно к нему приводится. В качестве фактического параметра-переменной можно указывать только переменную, тип которой в точности совпадает с типом формального параметра. </p> <p>При передаче параметра по ссылке в подпрограмму передается адрес фактического параметра. Поэтому если параметр занимает много памяти (массив, запись, строка), то обычно он также передается по ссылке. В результате в процедуру передается не сам параметр, а его адрес, что экономит память и время работы. При этом если параметр меняется внутри подпрограммы, то он передается с ключевым словом <code> <b>var</b></code>, если не меняется - с ключевым словом <code><b>const</b></code>:</p> <p>Например:</p> <blockquote> <code><b>type <br> </b> Person = <b>record</b><br> name: string;<br> age,height,weight: integer;<br> <b>end</b>;</code><p><code><b>procedure</b> Print(<b>const</b> p: Person);<br> <b>begin<br> </b> 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> 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> 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> <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> SetLength(a,10);<br> <b>end</b>;</code></p> </blockquote> </body> </html>