Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 156

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 150 151 152 153 154 155 < 156 > 157 158 159 160 161 162 .. 316 >> Следующая

sin(1) + sin(2) + • • • + sin(N) f (N) =-—-—--—-
cm(1) + cm(2) +-----+ cm(N)
Уместно потребовать, чтобы язык позволял описать функцию суммирования, которая умеет "работать" с различными общими членами. В С/С++ это достигается с помощью использования типа указатель на функцию с одним параметром в качестве типа формального параметра:
double sum (int N, double (*f)(double p))
{
double s = (*f)(1);
тризации.
440
ГЛАВА 8. ПОДПРОГРАММЫ
for ( double i = 2; i <= N ; i++ )
s += (*f)( i); return s;
}
Нужно обратить внимание на то, как вызывается функция-параметр: (*f)(i). ри взове sum вторым фактическим параметром дол ен быть адрес подхо-дяей функции, и тогда этот адрес станет значением формального параметра f. В сво очередь, значение этого параметр используется как адрес некоторой функции (косвенно указывает на нее), которая вызывается со своим параметром. При этом проверятся и, если нужно, преобразуются типы вызываемой функции-параметра и ее параметра. В результате оператор
double c = sum ( N, sin) / sum ( N, cm );
делает именно то, что ну но.
С точки зрения надежного программирования здесь плохо только то, что не видно различий меду косвенным обраением к чему-либо и вызовом процедуры, задаваемой в качестве параметра. Более строгая форма процедурной параметризации, представленная, например, в языке Pascal, позволяет это делать. Так, описание заголовка функции
function sum (N : Integer; function M (X : Real): Real): Real;
указывает, что второй параметр является функцией. Это очень похоже на С/С++. Но вот вызов этого параметра гораздо проще: M (<значение типа Real>) Эта конструкция прямо указывает на обраение к процедуре или функции без указания каких бы то ни было деталей реализации. То, что при таком в -зове никогда не произойдет коллизий со списками параметров, гарантируется описанием формального параметра-подпрограмм , которое специфицирует возмо ные фактические параметр .
В контексте приведенного описания правомерны выражения sum(N,sin) и sum(N,cm), поскольку sin и cm являются функциями, вырабатывающими значения вещественного типа с вещественным или целым (почему?) параметром, как того требует спецификация формального параметра-функции M. Следовательно, требуемое вычисление f(N) не отличается от того, как оно записывается в С/С++.
По правилам языка Pascal формальный параметр-функция задается в списке параметров с помощью синтаксической конструкции <заголовок функ-
8.5.
441
ции>, которая определяет шаблон для всех функций, подходящих для подстановки в качестве фактического параметра. Совершенно аналогично задается параметр-процедура, для которого шаблоном служит заголовок процедуры. потребляемое в таких заголовках имя подпрограмм -параметра обозначает ее для использования в конструкции взова процедур или функции. О но является именем формального параметра. Заголовок процедуры или функции, используемый для определения формального параметра, называется спецификацией параметра.
Как видно из примера, правило задания спецификации параметров-функций и процедур избыточно: оно требует указания имен формальных параметров специфицируемого параметра-подпрограммы (в примере — X), тогда как необходимой и достаточной информацией являются лишь их типы (в примере — Real). При выборе изображения для таких спецификаций автор языка Pascal стремился к минимизации синтаксических понятий языка, а потому отдал предпочтение указанному виду. В этой связи стоит отметить, что многие другие системы программирования в подобнх случаях не требу т указания избыточных имен.
При трансляции заголовка процедуры, имеющей формальный параметр-процедуру, для такого параметра отводится элемент памяти, которй представляет формальный параметр в теле процедуры. Ему при вызове обеспечивается присваивание адреса фактического параметра-процедуры, и это позволяет осуществлять вызов формального параметра с помощью тех же команд, которые задаются при обычном вызове процедуры. Таким образом, этот механизм в точности соответствует механизму передачи параметра по ссылке, которй, как бло указано на стр. 419, специальным образом оформляется синтаксически с той цель , чтобы изобра ение вызова обычной процедуры ничем не отличалось от вызова формального параметра. В результате при написании тела процедуры можно не замечать их различий и абстрагироваться от того, какие фактические параметр -процедуры будут подставляться вместо используемого формального параметра.
В языке Pascal передача процедуре алгоритма в качестве параметра подчиняется суественному ограничени : все параметр процедур, которе используются в качестве фактических параметров, подставляемых вместо формальных параметров-процедур, долн быть параметрами-значениями. В частности, невозмо но, чтобы у таких параметров бли б свои параметры-процедуры. Введение такого ограничение разумно, поскольку без него
442
ГЛАВА 8. ПОДПРОГРАММЫ
возможности контроля параметризации неоправданно сужаются21 (об этом речь пойдет ниже). Понятно, что в С/С++ просто нет места для этого ограничения.
ри спецификации как параметров-значений и параметров-переменнх, так параметров-процедур задается информация о типах, которая используется при контроле соответствия фактических и формальнх параметров. Тем не менее, в синтаксисе стандартного языка Pascal представлено явное разграничение между этими двумя видами описания параметров. Разработчики Turbo Pascal и Delphi предпочли отойти от указанного разграничения и приблизить оформление параметров-процедур к виду других параметров. ри-чины тому связан со стремлением к более гибким по сравнени со стандартным языком Pascal средствам манипулирования операционными сущностями программ. В результате описанные выше средства параметризации изобразительно отлича тся от тех, которе предлага тся в Delphi, в языке Object Pascal.
Предыдущая << 1 .. 150 151 152 153 154 155 < 156 > 157 158 159 160 161 162 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100