TURBO pascal v7.0
 
 

Процедуры         
и функции

 

 

 
Параметры-переменные, параметры-значения, параметры-константы

            

            Любой из формальных параметров подпрограммы может быть  либо  параметром-значением,  либо  параметром-переменной,  либо  параметром-константой.  Если параметры  определяются  как  параметры-переменные,  перед  ними  необходимо ставить зарезервированное слово VAR, например:                        

            procedure  p (var a : real);   Здесь  параметр  а  -  параметр-переменная.

      Заголовок процедуры может быть устроен так, что некоторые группы  формальныхпараметров не содержат слова VAR. Например:                       

            procedure  p (a,b,c:real; var s:real);

      Формальные параметры, которые входят в  группы,  не  содержащие  слова  VAR,называются формальными параметрами-значениями.

      Определение формального параметра тем или иным способом существенно  толькодля вызывающей программы: если формальный параметр  объявлен  как  параметр-переменная,  то  при  вызове   подпрограммы   ему   должен   соответствовать фактический параметр в виде переменной определенного  типа; если  формальный параметр  объявлен  как  параметр-значение,  то   при   вызове   ему   может соответствовать  произвольное   выражение.   Контроль за неукоснительным соблюдением этого правила осуществляет компилятором ТУРБО ПАСКАЛЯ.

      Для того чтобы понять, в каких случаях использовать параметры значения, а  вкаких  -  параметры-переменные,  рассмотрим,   как   осуществляется   замена формальных параметров на фактические в момент обращения к подпрограмме.

      Если  параметр  определен  как  параметр-значение,   то   перед   вызовомподпрограммы это значение вычисляется, полученный  результат  копируется  во временную память и передается подпрограмме. Важно учесть, что  даже  если  в качестве  фактического  параметра  указано  простейшее  выражение   в   виде переменной или константы, все равно подпрограмме будет передана  лишь  копия переменной  (константы).  Таким  образом,  назначение  параметра-значения  – передача данных из программы в подпрограмму. Если же параметр определен  как параметр-переменная, то при вызове подпрограммы передается сама  переменная, а не ее копия. Любые возможные изменения в  подпрограмме  параметра-значения никак не  воспринимаются  вызывающей  программой,  так  как  в  этом  случае изменяется копия фактического параметра, в то время как изменение параметра-переменной приводит к изменению самого фактического параметра  в  вызывающей программе. Параметр-константа схож с параметром-переменной:  в  подпрограмму передается сама константа, но изменение  её  невозможно.  Назначение  такого параметра совпадает с назначением параметра-значения. Формальные параметры-константы указываются в заголовке программы после  служебного  слова  const. Его действие распространяется до ближайшей точки с запятой.

Поясним изложенное.                        

Program ...;                      
…..       
var                           
            a, b: integer;                 
            f:boolean;                       
......                       
procedure squar(a: integer; var b: integer; const f : boolean);                       
begin             
               a:=sqr(a);                                       
               b:=sqr(b);                                   
               writeln(‘в квадрате они выглядят так: ’,a,’, ’,b);                       
end;                       
........                       
Begin                          
              a:=4; b:=6;                           
              writeln(‘внимательно посмотрите на эти числа:’ ,a, ’,’ ,b, ’,’ ,f);             
               squar(a,b);                
               writeln(‘а так, а не в квадрате: ’,a, ’, ’,b);                       
End.

      Результаты выглядят так:          внимательно посмотрите на эти числа: 4, 6
                                                              в квадрате они выглядят так: 16, 36
                                                              а  так, а не в квадрате: 4, 36                       

      Переменная   логического типа  не учувствовала в подпрограмме. Я лишь показал, как объявляются переменные константы, которые нельзя изменять в теле подпрограммы.                         

      Этот пример может  служить еще и иллюстрацией механизма «закрывания» глобальной переменной, а одноименной локальной: хотя переменная объявлена как  глобальная (она  описана  в  вызывающей программе перед описанием процедуры), в теле процедуры ее  «закрыла»  локальная  переменная а, объявленная как параметр-значение.                       

      Итак, параметры-переменные используются  как  средство  связи  алгоритма,реализованного в подпрограмме, с «внешним миром»: с помощью этих  параметровподпрограмма может передавать результаты своей работы вызывающей  программе.Разумеется,  в  распоряжении  программиста  всегда  есть  и  другой   способпередачи результатов - через глобальные переменные.  Однако  злоупотреблениеглобальными связями делает программу, как правило,  запутанной,  трудной  впонимании и сложной в отладке. В соответствии с требованиями хорошего  стиляпрограммирования рекомендуется там, где это, возможно, использовать  передачурезультатов через фактические параметры-переменные.                        

      С другой стороны, описание всех  формальных  параметров  как  параметров-переменных  нежелательно  по  двум  причинам.  

      Во-первых,   это   исключаетвозможность  вызова  подпрограммы  с   фактическими   параметрами   в   видевыражений, что делает программу менее компактной.

       Во-вторых,  и  главных,  вподпрограмме  возможно  случайное   использование   формального   параметра,например, для временного хранения  промежуточного  результата,  т.е.  всегдасуществует опасность  непреднамеренно  «испортить»  фактическую  переменную.

      Вот почему параметры-переменные следует объявлять только те,  через  которыеподпрограмма в действительности передает  результаты  вызывающей  программе.Чем меньше параметров  объявлено  параметрами-переменными  и  чем  меньше  вподпрограмме  используется  глобальных  переменных,  тем  меньше   опасностьполучения непредусмотренных программистом  побочных  эффектов,  связанных  свызовом подпрограммы, тем проще программа в понимании и отладке.

Главная страница || Оценивание || Библиография || Автор
Используются технологии uCoz