Передача параметров в подпрограмму.
Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров.
Переменные, указанные в заголовке подпрограммы называются формальными параметрами или просто параметрами подпрограммы. Эти переменные могут использоваться внутри подпрограммы. Список переменных в операторе вызова подпрограммы – это фактические параметры, или аргументы.
Механизм передачи параметров обеспечивает обмен данных между формальными и фактическими параметрами, что позволяет выполнять подпрограмму с различными данными. Между фактическими параметрами в операторе вызова и формальными параметрами в заголовке подпрограммы устанавливается взаимно однозначное соответствие. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.
Передача параметров выполняется следующим образом. Вычисляются выражения, стоящие на месте фактических параметров. В памяти выделяется место под формальные параметры в соответствии с их типами. Выполняется проверка типов и при их несоответствии выдается диагностическое сообщение. Если количество и типы формальных и фактических параметров совпадают, то начинает работать механизм передачи данных между фактическими и формальными параметрами.
Формальные параметры процедуры можно разделить на два класса: параметры-значения и параметры-переменные.
При передаче данных через параметры-значения в подпрограмму передаются значения фактических параметров, и доступа к самим фактическим параметрам из подпрограммы нет.
При передаче данных параметры-переменные заменяют формальные параметры, и, следовательно, в подпрограмме есть доступ к значениям фактических параметров. Любое изменение параметров переменных в подпрограмме приводит к изменению соответствующих им формальных параметров. Следовательно, входные данные следует передавать через параметры-значения, для передачи изменяемых в результате работы подпрограммы данных следует использовать параметры-переменные.
Процедуры.
Описание процедуры имеет вид:
Начинается описание с заголовка процедуры, где procedure – ключевое слово языка, имя_процедуры – любой допустимый в языке Free Pasacal идентификатор, формальные_параметры – имена формальных параметров и их типы, разделенные точкой с запятой.
Рассмотрим примеры заголовков процедур с параметрами-значениями:
procedure name_1(r:real; i:integer; c:char);
Однотипные параметры могут быть перечислены через запятую:
procedure name_2(a,b:real; i,j,k:integer);
Список формальных параметров не обязателен и может отсутствовать:
Если в заголовке процедуры будут применяться параметры-переменные, то перед ними необходимо указывать служебное слово var, перед параметрами-значениями слово var отсутствует:
procedure name_4(x,y:real; var z:real);
//x, y – параметры-значения,
После заголовка идет тело процедуры, которое состоит из раздела описаний (константы, типы, переменные, процедуры и функции, используемые в процедуре) и операторов языка, реализующих алгоритм процедуры.
Для обращения к процедуре необходимо использовать оператор вызова:
Фактические параметры в списке оператора вызова отделяются друг от друга запятой:
Если в описании процедуры формальные параметры отсутствовали, то и при вызове их быть не должно:
Функции.
Описание функции также состоит из заголовка и тела:
Заголовок функции содержит: служебное слово function, любой допустимый в языке Free Pascal идентификатор — имя_функции; имена формальных параметров и их типы, разделенные точкой с запятой — формальные_параметры, тип возвращаемого функцией значения — тип (функции могут возвращать скалярные значения целого, вещественного, логического, символьного или ссылочного типа).
Примеры описания функций:
function fun_1 (x:real):real;
function fun_2(a, b:integer):real;
Тело функции состоит из раздела описаний (константы, типы, переменные, процедуры и функции, используемые в процедуре) и операторов языка, реализующих ее алгоритм. В теле функции всегда должен быть хотя бы один оператор, присваивающий значение имени функции.
function fun_2(a, b:integer):real;
Обращение к функции осуществляется по имени с указанием списка фактических параметров, разделенных запятой:
Приложение 2.
Массивы.
Массив – структурированный тип данных, состоящий из фиксированного числа элементов одного типа.
Массив, представляющий собой просто список данных одного и того же типа, называют простым, или одномерным массивом. Для доступа к данным, хранящимся в определенном элементе массива, необходимо указать имя массива и порядковый номер этого элемента, называемый индексом.
Если возникает необходимость хранения данных в виде таблиц, в формате строк и столбцов, то необходимо использовать многомерные массивы.
Например массив, состоящего из строк и столбцов. Это двумерный массив. Строки в нем можно считать первым измерением, а столбцы — вторым. Для доступа к данным, хранящимся в этом массиве, необходимо указать имя массива и два индекса, первый должен соответствовать номеру строки, а второй — номеру столбца, в которых хранится необходимый элемент.
Описание массивов
Для описания массива служат служебные слова array of. Описать массив можно двумя способами:
Ввести новый тип данных, а потом описать переменные нового типа. В этом случае формат оператора type следующий:
имя_типа = array [тип_индекса] of тип_компонентов;
В качестве типа_индекса следует использовать перечислимый тип. Тип_компонентов — это любой ранее определенный тип данных, например:
massiv=array[0..12] of real;
//Тип данных massiv из 13 элементов, элементы нумеруются от 0 до 12.
dabc=array[-3..6] of integer;
//Тип данных dabc из 10 элементов, элементы нумеруются от -3 до 6.
Можно не вводить новый тип, а просто описать переменную следующим образом:
переменная: array [тип_индекса] of тип_переменной;
z,x: array[1..25] of word;
//Массивы z и x из 25 значений типа word,
//элементы нумеруются от 1 до 25.
g:array[-3..7] of real;
//Массив g из 11 значений типа real, которые нумеруюся от -3 до 7.
Для описания массива можно использовать предварительно определенные константы:
a: array[1..n] of real;
b: array[0..m] of byte;
Константы должны быть определены до использования, так как массив не может быть переменной длины!
Двумерный массив (матрицу) можно описать, применив в качестве базового типа (типа компонентов) одномерный:
massiv=array[1..200] of real;
matrica=array[1..300] of massiv;
Такая же структура получается при использовании другой формы записи:
matrica = array [1..300,1..200] of real;
var ab:array [1..300,1..200] of real;
При всех трех определениях мы получали матрицу вещественных чисел, состоящую из 300 строк и 200 столбцов.
Аналогично можно ввести трехмерный массив, или массив большего числа измерений:
Источник
BestProg
Функции. Часть 1. Описание функции. Фактические и формальные параметры. Передача параметров в функцию по значению и по адресу. Прототип функции
Содержание
Поиск на других ресурсах:
1. Что такое функция? Определение функции. Преимущества использования функций
При написании программ среднего и высокого уровня сложности возникает потребность в их разбиении на части. Разбиение большой программы на меньшие части позволяет уменьшить риск возникновения ошибок, повышает читабельность программного кода благодаря его структурированию.
Кроме того, если некоторый программный код повторяется несколько раз (или есть близким по смыслу), то целесообразно организовать его в виде функции, которую потом можно вызывать многократно используя ее имя. Таким образом, происходит экономия памяти, уменьшение исходного кода программы, и т.п..
Функция – это часть программы, которая имеет следующие свойства или признаки:
- есть логически самостоятельной частью программы;
- имеет имя, на основании которого осуществляется вызов функции (выполнение функции). Имя функции должно соответствовать правилам создания идентификаторов языка C++;
- может содержать список параметров, которые передаются ей для обработки или использования. Если функция не содержит списка параметров, то такая функция называется функцией без параметров;
- может возвращать (не обязательно) некоторое значение. В случае, если функция не возвращает никакого значения, тогда указывается ключевое слово void ;
- имеет собственный программный код, который расположен между фигурными скобками < >. Программный код решает задачу, поставленную на эту функцию. Программный код функции, реализованный в фигурных скобках, называется «тело функции».
Использование функций в программах дает следующие преимущества:
- компактная организация программы путем удобного вызова программного кода по его имени, который в программе может встречаться несколько раз (повторяться);
- экономия памяти, размера исходного и исполнительного кода и т.д.;
- уменьшение риска возникновения ошибок для больших наборов кодов;
- повышение читабельности программного кода.
2. Какая общая форма описания функции?
Общая форма описания функции выглядит следующим образом:
- тип– тип значения, возвращаемого функцией. Если поле « тип » содержит ключевое слово void , то функция не возвращает никакого значения;
- имя_функции – это непосредственно имя функции. По этому имени осуществляется вызов программного кода, реализованного в теле_функции . Кроме того, имя_функции есть указателем на эту функцию . Значением указателя есть адрес точки входа в функцию;
- список_параметров – параметры, которые передаются в функцию. Функция может получать любое число параметров. Если описывается функция без параметров, то в скобках указывается ключевое слово void ;
- тело_функции – набор операторов программного кода, реализующих алгоритм вычисления внутри функции;
- return (выражение) – ключевое слово return указывает, что функция возвращает значение заданное в (выражение) . Слово return может встречаться в нескольких местах тела функции в зависимости от алгоритма (повторяться).
3. Примеры описания и использования функций, которые не возвращают значения
Если функция не возвращает значения, тогда она должна начинаться из ключевого слова void .
Пример 1. Функция MyFunc1() без параметров, которая не возвращает значения.
Если в теле некоторого класса или модуля описать функцию:
тогда вызвать эту функцию можно следующим образом:
Пример 2. Функция MyFuncMult2() , которая получает один параметр целого типа и не возвращает значения. Функция осуществляет умножение полученного параметра на 2 и выводит результат на форму в элементе управления label1 .
Вызов функции из другого программного кода:
Пример 3. Функция, которая получает 2 параметра типа double , находит их произведение и выводит его на форму в элементе управления label1 .
Вызов функции из другого программного кода:
4. Примеры описания и использования функций, которые получают один параметр
Пример 1. Функция, которая получает один параметр целого типа, умножает его на 5 и возвращает результат. Функция не выполняет вывода результата.
Вызов функции из другого программного кода
Пример 2. Функция вычисления значения y = sign(x) , определяющегося по правилу:
Реализация функции:
Вызов функции из другого программного кода:
5. Примеры описания и использования функций, которые получают два и больше параметра
Пример 1. Пример функции MaxFloat() , получающей 2 параметра типа float и возвращающей максимум из них.
Следует обратить внимание, что в данной функции 2 раза встречается оператор return .
Вызов функции MaxFloat() из другого программного кода:
Пример 2. Функция MaxInt3() , которая находит максимальное значение между тремя целыми числами.
Вызов функции из другого программного кода
6. Какие существуют способы передачи параметров в функцию? Пример
В C++ существует 3 способа передачи параметров в функцию:
- передача параметра по значению ( Call-By-Value ). Это простая передача копий переменных в функцию. В этом случае изменение значений параметров в теле функции не изменит значений, которые передавались в функцию извне (при ее вызове);
- передача параметра по адресу переменной. В этом случае функции в качестве параметров передаются не копии переменных, а копии адресов переменных, то есть указатель на переменную. Используя этот указатель функция осуществляет доступ к нужным ячейкам памяти где расположена передаваемая переменная и может изменять ее значение. Общие сведения об указателях приведены здесь ;
- передача параметра по ссылке ( Call-By-Reference ). Передается ссылка (указатель) на объект (переменную), что позволяет синтаксически использовать эту ссылку как указатель, и как значение. Изменения, внесенные в параметр, который передается по ссылке, изменяют исходную копию параметра вызывающей функции.
Пример. Этот пример демонстрирует отличие между передачей параметров по значению, по адресу и по ссылке. Описывается функция, которая получает три параметра. Первый параметр ( x ) передается по значению. Второй параметр ( y ) передается по адресу (как указатель). Третий параметр ( z ) передается по ссылке.
Демонстрация вызова функции MyFunction() из другого программного кода:
Как видно из результата, значение переменной a не изменилось. Переменная a передавалась в функцию MyFunction() с передачей значения (первый параметр).
Однако, значение переменной b после вызова функции MyFunction() изменилось. Это связано с тем, что в функцию MyFunction() передавалось значение адреса переменной b . Имея адрес переменной b в памяти компьютера, внутри функции MyFunction() можно изменять значения этой переменной с помощью указателя y .
Точно так же изменилось и значение c после вызова функции. Ссылка есть адрес объекта в памяти. С помощью этого адреса можно иметь доступ к значению объекта.
7. Что такое формальные и фактические параметры функции? Пример
Формальные параметры – это переменные, принимающие значение аргументов (параметров) функции. Если функция имеет несколько аргументов (параметров), их тип и имена разделяются запятой ‘ , ‘ .
При вызове функции с параметрами, компилятор осуществляет копирование копий формальных параметров в стек.
Пример. Функция MyAbs() , находящая модуль числа имеет один формальный параметр x .
Вызов функции из другого программного кода (другой функции)
При вызове функции из другого программного кода имеет место фактический параметр. В данном примере фактический параметр это переменная a и константа 23.
При вызове функции фактические параметры копируются в специальные ячейки памяти в стеке (стек – часть памяти). Эти ячейки памяти отведены для формальных параметров. Таким образом, формальные параметры (через использование стека) получают значение фактических параметров.
Поскольку, фактические параметры копируются в стек, то изменение значений формальных параметров в теле функции не изменит значений фактических параметров (так как это есть копия фактических параметров).
8. Какая область видимости формальных параметров функции? Пример
Область видимости формальных параметров функции определяется границами тела функции, в которой они описаны. В приведенном ниже примере формальный параметр n целого типа имеет область видимости в границах фигурных скобок < >.
Пример. Функция, которая вычисляет факториал целого числа n .
Вызов функции из другого программного кода (другой функции):
9. Что такое прототип функции? Пример
Прототип функции – это соообщение компилятору и другим функциям о том, что такая функция существует. Иными словами, это сообщение компилятору и другим функциям о том, что в программе существует функция с указанной сигнатурой. Прототип функции состоит из сокращенного описания без тела функции.
Прототип функции содержит:
- имя функции;
- параметры функции или типы этих параметров;
- тип значения, возвращаемого функцией.
Общая форма объявления прототипа функции следующая:
- return_type – тип, возвращаемый функцией;
- FuncName – имя функции;
- parameters – параметры функции.
При указании прототипа функции необязательно указывать имена параметров. Например, для функции
можно указать следующий прототип
В случаях, когда вызываемая функция, объявлена перед вызывающей ее функцией, можно обойтись без использования прототипа. В других случаях прототип функции обязателен.
Если функция объявляется в классе и вызывается из методов этого класса, тогда подобных ошибок не будет. Это объясняется тем, что в классе прототип функции известен всем методам класса.
10. Пример, демонстрирующий необходимость использования прототипа функции
Пусть заданы 2 функции с именами A() и B () . Здесь важен порядок объявления и порядок вызова. Если из функции B() вызвать функцию A() , объявление и тело которой реализованы после функции B() , как показано ниже
то компилятор выдаст сообщение об ошибке
Чтобы поправить ситуацию, нужно функции B() сообщить, что в программе (текущем модуле) есть реализация функции A() . В нашем случае реализация функции A() помещена после реализации функции B() . Для этого перед функцией B() нужно объявить прототип функции A() как показано ниже
Источник