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

 

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

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

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 130 131 132 133 134 135 < 136 > 137 138 139 140 141 142 .. 316 >> Следующая

Следуие два программных текста представля т собой описания наших сквозных примеров процедур MyOwnInpMatr и MyInpMatr. Они демон-стриру т возмо ности определения функций в глобальном контексте для языка С. В данном случае предлагается использовать контекст с описанием одной матрицы:
Matrix Matr;
ервая функция долна вызываться, когда размерность Matr, т. е. переменная N , заранее определена, вторая, когда требуется определить N , задать ей нужное значение.
Программа 8.3.3
void MyOwnInpMatr() {
int
printf("Enter matrix data:\n"); for(i=0; i < N; i++) {
6 Если же пользоваться встраиваемыми функциями, то правила локализации имен сохраняются.
8.3.
389
printf("Row %3i:",i); for(j=0; j < N; j++)
scanf("°/of",& Matr printf("\n"); }
}
Програма 8.3.4
int MyInpMatr()
{
int i,j,N=0;
char c; // Переменная используется для определения // окончания ввода первой строки матрицы
printf("Enter matrix data:\n");
printf("Row 0:");
do
scanf("%f%c",& Matr [0][N++],&c); while(c!='\n'); // scanf("\n");
for(i=1; i < N; i++) {
printf("Row %2i:",i); for(j=0; j < N; j++)
scanf("%f",& Matr [i][j]);
do
scanf("%c",&c); while(c!='\n'); }
return N;
}
В описании локального контекста функции MyInpMatr определяется переменная N , что иллстрирует пересечение глобального и локального контекстов
390
ГЛАВА 8. ПОДПРОГРАММЫ
по именам. Как было сказано выше, локальное N делает недоступным для использования в теле функции глобального N, а потому все присваивания значений локальной переменной N никак не влияют на значение внешней переменной N.
Тело функции MyInpMatr демонстрирует, каким способом в С/С++ значение функции передается в точку ее взова: оператор return N;
В ранних языках для этой цели применяется прием, который назовем ал-головский возврат, т. к. впервые он появился в Algol 60: присваивание имени функции (это не переменная, котору мо но использовать!) вырабатвае-мого значения. Этот прием сегодня можно считать устаревшим, но его приходится сохранять, например, в языках линии Pascal для преемственности. Следует, тем не менее, заметить, что алголовский возврат значения функции в определенном смысле выразительнее: можно выработать значение, а после этого продолать другие вчисления функции. о такая возмо ность всегда достиима с помоь использования переменной ну ного типа (в частности в Object Pascal для такой переменной вводится специальное обозначение Result, и, тем самым атавизм языка Pascal может быть превращен в преимущество).
Наслоение новых и старых подходов привело к тому, что в Object Pascal возмо ные противоречия
Result := 17; F := 5;
ликвидиру тся на уровне прагматики.
Уже упоминалось, что функция MyInpMatr более автономна, чем процедура MyOwnInpMatr, так как не требует, чтобы заранее был известен размер матрицы. о этой причине бло сказано, что ее использование предпочтительнее. В то е время, соверенно понятно, что как та, так и другая подпрограмма сликом зависят от глобального контекста, чтобы их мо но б -ло сравнивать по этому критерию (обе предназначены для ввода одной и той е матрицы). дальнейем будут обсу даться языковые средства, позво-ляие повать автономность подпрограмм, и в этой связи на примере MyInpMatr и MyOwnInpMatr будет показано, как применять такие средства.
§ 8.4. ВЫЗОВ ПРОЦЕДУРЫ
8.4.1. Семантика вызова процедуры
ель данного параграфа состоит в том, чтоб дать представление о семантике языковх конструкций, которые зада т в программе вполнение
8.4. ВЫЗОВ ПРОЦЕДУРЫ
391
алгоритма процедуры (оператора процедуры и использования функции в качестве составляющего выражения), т. е. ответ на вопрос, что происходит при выполнении программы, когда очередное действие требует вызова процедуры. Обращаясь к терминологии модели вычислений языка, эту цель можно сформулировать как обсу дение действий абстрактного вычислителя яз -ка, связанных с вычислением конструкций <оператор вызова процедуры> и использование функции>.
Синтаксически вызов процедуры практически во всех языках программирования оформляется с помоь употребления в тексте программ имени процедуры или функции 7. Процесс, который активизируется при выполнении конструкции вызова процедуры, разбивается на три фаз :
• подготовка выполнения процедуры;
• выполнение алгоритма процедуры;
• завершение выполнения процедуры.
На первой фазе абстрактный вычислитель языка
1. создает локальный контекст: обеспечивает возможность оперирования с системой контекстов, доступных для операторов тела вызываемой процедуры, в частности, он выделяет память для локального контекста процедуры;
2. осуществляет вход в подпрограмму: передает управление на тело процедуры с запоминанием точки возврата, т. е. адреса, куда должно будет передаваться управление после вполнения процедуры.
Вторая фаза заключается в
3. активизируется абстрактный вычислитель языка: выполняются оператор тела процедуры.
а третьей фазе абстрактнй вчислитель язка
7 Неявный, 'безымянный' вызов подпрограммы возможен в тех языках, которые допускают задание программистом реакции на события, возникающие в ходе вычислений или же запроцедуривание: превращение некоторого выражения или оператора в неявную процедуру. Этот случай целесообразно рассмотреть отдельно, когда основа механизма вызова будет изучена.
Предыдущая << 1 .. 130 131 132 133 134 135 < 136 > 137 138 139 140 141 142 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100