Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
933 Кб
Скачать
☆

7.3.2. Передача данных между процедурами

Схема обмена данными между процедурами:

Входные аргументы Выходные аргументы

Результат

Исходные данные Результаты

Входные параметры Выходные параметры

Возвращаемое значение функции разумно считать специфическим выходным параметром.

Механизмы передачи данных

Существуют 2 механизма передачи информации между процедурами: по значению и по адресу (ссылке, имени, наименованию).

Передача по значению подразумевает временное автоматическое копирование аргумента и отправку в вызываемую процедуру его копии. Это означает, что изменить в вызываемой процедуре значение исходного аргумента нельзя! Очевидно, что таким образом можно передавать только входные данные.

Во втором механизме передается адрес аргумента и, следовательно, возможно его изменение в вызываемой процедуре. Этот механизм применяется для выходных данных (результатов работы) вызываемой процедуры.

В языке C по умолчанию реализован механизм передачи по значению, поэтому для обеспечения возврата результатов выполнения процедур применяются оператор & (найти адрес по имени) для аргумента, * (извлечь содержимое памяти по заданному адресу) для параметра и специальные типы переменных, называемые указателями (pointer).

Указатель – переменная, значением которой является адрес другой переменной. Указатель имеет тип переменной, адрес которой он хранит.

Формат определения указателей:

<тип> *<имя>[, *<имя>]...;

Символ * перед именем в определении переменной говорит о том, что она является указателем. Указатели, как и обычные переменные, могут быть организованы в массивы и входить в состав структур.

Пример.

int *kol, *nom, x, y, *px;

double *rasst, *dlina;

..................................

px=&x;

y=*px;

Это эквивалентно y=x.

Более подробно работа с указателями будет рассмотрена позже.

В языке Basic можно реализовать оба механизма передачи аргументов. В версиях Visual Studio 2008, 2010 для этого используются ключевые слова ByVal (передача по значению) и ByRef (передача по адресу). По умолчанию в данных версиях, как и в языке С, реализована передача аргументов по значению (в отличие от предыдущих версий). То есть, если перед параметром опущено ключевое слово ByVal или ByRef, то среда подставит слово ByVal. Данных, подобных указателям, нет.

Прототипы функций (c)

Поскольку каждая процедура может транслироваться независимо, в вызывающей процедуре должна быть помещена информация о том, в каком порядке будут передаваться аргументы в вызываемую процедуру, о типах и организации каждого параметра, в том числе и возвращаемого значения. Для этой цели в языках C и C++ применяется конструкция языка, называемая прототипом функции. В языке C употребление прототипа рекомендуется, но не является обязательным, в C++ отсутствие прототипа вызывает ошибку трансляции.

Формат прототипа:

<тип><имя>(<описание параметра>[,

<описание_параметра>]...);

Пример. Прототип функции вычисления определенного интеграла методом трапеций.

double trap(double, double, int, double (*)(double));

Вызов функции:

.................................................................................

i=trap(0, alfa, 20, f1);// Без прототипа ошибка: 0 – целое значение

.................................................................................

Если типы аргумента и соответствующего параметра не совпадают, то выполняется в соответствии с прототипом допустимое преобразование и в память, выделяемую транслятором этому параметру, попадает уже преобразованное значение. Аналогичные манипуляции производятся при возврате результатов в вызывающую процедуру. Имя параметра в прототипе указывать необязательно, существенно лишь задание его типа и организации (массив).

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

Пример. Все математические функции имеют в качестве параметров и возвращаемого значения данные типа double. Их прототипы хранятся в заголовочном файле math.h. Например, double sin(double);

В языке Basic при несовпадении типов аргумента и параметра автоматического преобразования нет, поэтому в данном случае происходит ошибка трансляции. Ниже будет показано, как можно дать указание транслятору выполнить такое преобразование.