Можно ли имя функции передавать в качестве фактического параметра

BestProg

Функции. Часть 1. Описание функции. Фактические и формальные параметры. Передача параметров в функцию по значению и по адресу. Прототип функции

Содержание

Поиск на других ресурсах:

1. Что такое функция? Определение функции. Преимущества использования функций

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

Кроме того, если некоторый программный код повторяется несколько раз (или есть близким по смыслу), то целесообразно организовать его в виде функции, которую потом можно вызывать многократно используя ее имя. Таким образом, происходит экономия памяти, уменьшение исходного кода программы, и т.п..

Функция – это часть программы, которая имеет следующие свойства или признаки:

Использование функций в программах дает следующие преимущества:

2. Какая общая форма описания функции?

Общая форма описания функции выглядит следующим образом:

3. Примеры описания и использования функций, которые не возвращают значения

Пример 1. Функция MyFunc1() без параметров, которая не возвращает значения.

Если в теле некоторого класса или модуля описать функцию:

тогда вызвать эту функцию можно следующим образом:

Вызов функции из другого программного кода:

Вызов функции из другого программного кода:

4. Примеры описания и использования функций, которые получают один параметр

Пример 1. Функция, которая получает один параметр целого типа, умножает его на 5 и возвращает результат. Функция не выполняет вывода результата.

Вызов функции из другого программного кода

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметраРеализация функции:

Вызов функции из другого программного кода:

5. Примеры описания и использования функций, которые получают два и больше параметра

Вызов функции MaxFloat() из другого программного кода:

Вызов функции из другого программного кода

6. Какие существуют способы передачи параметров в функцию? Пример

В C++ существует 3 способа передачи параметров в функцию:

Пример. Этот пример демонстрирует отличие между передачей параметров по значению, по адресу и по ссылке. Описывается функция, которая получает три параметра. Первый параметр ( x ) передается по значению. Второй параметр ( y ) передается по адресу (как указатель). Третий параметр ( z ) передается по ссылке.

Демонстрация вызова функции MyFunction() из другого программного кода:

Как видно из результата, значение переменной a не изменилось. Переменная a передавалась в функцию MyFunction() с передачей значения (первый параметр).

Точно так же изменилось и значение c после вызова функции. Ссылка есть адрес объекта в памяти. С помощью этого адреса можно иметь доступ к значению объекта.

7. Что такое формальные и фактические параметры функции? Пример

При вызове функции с параметрами, компилятор осуществляет копирование копий формальных параметров в стек.

Вызов функции из другого программного кода (другой функции)

При вызове функции из другого программного кода имеет место фактический параметр. В данном примере фактический параметр это переменная a и константа 23.

При вызове функции фактические параметры копируются в специальные ячейки памяти в стеке (стек – часть памяти). Эти ячейки памяти отведены для формальных параметров. Таким образом, формальные параметры (через использование стека) получают значение фактических параметров.

Поскольку, фактические параметры копируются в стек, то изменение значений формальных параметров в теле функции не изменит значений фактических параметров (так как это есть копия фактических параметров).

8. Какая область видимости формальных параметров функции? Пример

Область видимости формальных параметров функции определяется границами тела функции, в которой они описаны. В приведенном ниже примере формальный параметр n целого типа имеет область видимости в границах фигурных скобок < >.

Вызов функции из другого программного кода (другой функции):

9. Что такое прототип функции? Пример

Прототип функции – это соообщение компилятору и другим функциям о том, что такая функция существует. Иными словами, это сообщение компилятору и другим функциям о том, что в программе существует функция с указанной сигнатурой. Прототип функции состоит из сокращенного описания без тела функции.

Прототип функции содержит:

Общая форма объявления прототипа функции следующая:

При указании прототипа функции необязательно указывать имена параметров. Например, для функции

можно указать следующий прототип

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

Если функция объявляется в классе и вызывается из методов этого класса, тогда подобных ошибок не будет. Это объясняется тем, что в классе прототип функции известен всем методам класса.

10. Пример, демонстрирующий необходимость использования прототипа функции

то компилятор выдаст сообщение об ошибке

Источник

Формальные и фактические параметры

Рассмотрим более подробно вопросы взаимодействия формальных и фактических параметров.

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

Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные точками с запятыми. В группу формальных параметров включаются однотипные параметры одной категории.

Все формальные параметры можно разбить на четыре категории:

— параметры-значения (эти параметры подпрограмма может изменить в основной подпрограмме);

— параметры-переменные (эти параметры подпрограмма может изменить в основной программе);

— параметры-константы (только в версии 7.0);

— параметры-процедуры и параметры-функции (т.е. процедурного типа).

Для каждого формального параметра следует указать имя и, как правило, тип, а в случае параметра-переменной или параметра-константы — категорию. Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип.

Например, нельзя писать

Function SUMM (A: array[1..100] of Real): Real;

Чтобы правильно записать этот заголовок, следует в основной программе ввести тип-массив, а затем использовать его в заголовке:

Type aArr = array[1..100] of real;

Function SUMM (A: aArr): Real;

При обращении к подпрограмме формальные параметры заменяются на соответствующие фактическиевызывающей программы или подпрограммы.

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

Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие — типом. Тип параметра-значения может быть любым, за исключением файлового.

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

Procedure MIN_MAX(Max,Min: Real; n: Word);

Function Tabulir(X,Y: Integer): Real;

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

Пример 2.6.Использовать функцию для вычисления максимального элемента в массиве.

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

aArr = Array[1..] of Integer;

Var Massiv: aArr; Maxim: Integer;

Функция в этом случае может иметь следующий вид.

Function Max(Mas: aArr; N: Byte): Integer;

Var Ma : Integer; i : Byte;

If MaMas[i] then Ma := Mas[i];

Пусть надо определить максимальное число из первых 35 чисел массива. Это можно сделать с помощью оператора, использующего обращение к функции: Maxim := Max(Massiv,35);

Примечание. Данная программа может работать только с массивами типа аАrr. Для массивов другого типа надо создавать другую аналогичную подпрограмму. Данная программа создает в стеке копию исходного массива, поэтому она работает медленно.

Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово VAR. Действие слова VAR распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.

Пример 2.8. Procedure MaxMin(A: аАrr; Var Max, Min: Real; N: Word);

Здесь Max, Min- параметры-переменные, а переменные А и N — параметры-значения.

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

Type аАrr = array [1.. 100] of Integer;

то и фактический параметр должен быть переменной или типизированной константой типа аАrr.

Использовать функцию для вычисления максимального элемента в массиве.

В основной программе определяется тип-массив.

Type аАrr = Array [1.. 50] of Integer;

Var Massiv: аАrr; Maxim: Integer;

Функция в этом случае может иметь вид:

Function Max(Var Mas: аАгг; N: Byte): Integer;

Var Ma : Integer; i : Byte;

If MaMas[i] then Ma := Mas[i];

Пусть надо определить максимальное число из первых 35 чисел массива Это можно сделать с помощью оператора:

Примечание. Эта программа лучше предыдущей тем, что в данном случае в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память. Однако при такой передаче параметра возможно его нежелательное изменение (этот вариант передачи параметра допустим только в таких небольших подпрограммах, как в данном случае, когда программист может проконтролировать несанкционированное изменение параметра). Недостатком этой программы, как и ранее описанной, является то, что она может работать только с одним типом массива.

Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако если эта переменная имеет больший размер (массив, запись и т.д.), то копия этого параметра займет большую часть стека и даже может его переполнить. Это приводит также к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, но предусматривается защита от его изменения. Использовать параметр-константу можно только в версии Турбо Паскаля 7.0.

Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово Const. Действие слова Const распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.

Пример 2.10.Function NewString(Const S: String): String;

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

Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра.

Функция вычисления максимального элемента в массиве, и в качестве первого параметра – параметр-константа.

Function Max(Const Mas: аАrr; N: Byte): Integer;

Var Ma : Integer; i : Byte;

If MaMas[i] then Ma := Mas[i];

Параметры без типа

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

Пример 2.12.Function Tqual(Var Param1, Param2; Len: Word):Boolean;

Здесь Param1, Param2 — параметры-переменные без типа (вместо них можно использовать, например, любые переменные простого типа, типа-массив, типа-запись и т.д.); Len — параметр-значение.

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

Пример 2.13.Функция вычисления максимального элемента в массиве. При этом в качестве первого параметра используется параметр-переменная без типа:

Function Max(Var Masr; N: Byte): Integer;

Type aArray = array[Maxint] of Integer;

Var Ма : Integer; i : Byte;

Begin Ма := aArray(Mas)[1];

If МаaArray(Mas)[i] then Ма := aArray(Mas)[i];

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

Статьи к прочтению:

Ээ в этом случае наши полномочия все окончены

Похожие статьи:

Лабораторная работа №3 Использование подпрограмм в системе MATLAB Цель работы: Знакомство с организацией функций в MATLAB, особенностями их работы….

Существует несколько способов передачи параметров в подпрограмму. § Передача параметров по значению. Формальному параметру присваивается значение…

Источник

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

Внимание! Материал данной статьи устарел. Рекомендуется использовать документацию к платформе “1С:Предприятие 8”.

Встроенный язык 1С:Предприятия поддерживает два способа передачи параметров в процедуры и функции: передача параметров по ссылке и передача параметров по значению.

Передача параметров по ссылке

По умолчанию, во встроенном языке 1С:Предприятия 8 передача параметров в процедуры и функции осуществляется по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции будет отражаться на значении фактического параметра, переданного при вызове процедуры или функции.

Передача параметров по значению


Особенности передачи переменных различных типов данных по значению

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

Рассмотрим в качестве примера ситуацию, когда параметром процедуры, передаваемым по значению, является таблица значений. Внутри вызываемой процедуры СвернутьТаблицу() таблица значений, переданная в качестве параметра при вызове процедуры, сворачивается:

Схематично изобразить происходящее при вызове процедуры СвернутьТаблицу(Тз) можно следующим образом:

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

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

Источник

Функции

Введение

Ч ем дальше мы изучаем си, тем больше становятся программы. Мы собираем все действия в одну функцию main и по несколько раз копируем одни и те же действия, создаём десятки переменных с уникальными именами. Наши программы распухают и становятся всё менее и менее понятными, ветвления становятся всё длиннее и ветвистее.

Но из сложившейся ситуации есть выход! Теперь мы научимся создавать функции на си. Функции, во-первых, помогут выделить в отдельные подпрограммы дублирующийся код, во-вторых, помогут логически разбить программу на части, в-третьих, с функциями в си связано много особенностей, которые позволят использовать новые подходы к структурированию приложений.

Функция – это именованная часть программы, которая может быть многократно вызвана из другого участка программы (в котором эта функция видна). Функция может принимать фиксированное либо переменное число аргументов, а может не иметь аргументов. Функция может как возвращать значение, так и быть пустой (void) и ничего не возвращать.

Мы уже знакомы с многими функциями и знаем, как их вызывать – это функции библиотек stdio, stdlib, string, conio и пр. Более того, main – это тоже функция. Она отличается от остальных только тем, что является точкой входа при запуске приложения.
Функция в си определяется в глобальном контексте. Синтаксис функции:

Самый простой пример – функция, которая принимает число типа float и возвращает квадрат этого числа

Внутри функции sqr мы создали локальную переменную, которой присвоили значение аргумента. В качестве аргумента функции передали число 9,3. Служебное слово return возвращает значение переменной tmp. Можно переписать функцию следующим образом:

В данном случае сначала будет выполнено умножение, а после этого возврат значения. В том случае, если функция ничего не возвращает, типом возвращаемого значения будет void. Например, функция, которая печатает квадрат числа:

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

Если функция не принимает аргументов, то скобки оставляют пустыми. Можно также написать слово void:

Формальные и фактические параметры

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

Например, пусть есть функция, которая возвращает квадрат числа и функция, которая суммирует два числа.

Обращаю внимание, что приведение типов просиходит неявно и только тогда, когда это возможно. Если функция получает число в качестве аргумента, то нельзя ей передать переменную строку, например “20” и т.д. Вообще, лучше всегда использовать верный тип или явно приводить тип к нужному.
Если функция возвращает значение, то оно не обязательно должно быть сохранено. Например, мы пользуемся функцией getch, которая считывает символ и возвращает его.

Передача аргументов

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

Программы выведет
200
100
200
Понятно почему. Внутри функции мы работаем с переменной x, которая является копией переменной d. Мы изменяем локальную копию, но сама переменная d при этом не меняется. После выхода из функции локальная переменная будет уничтожена. Переменная d при этом никак не изменится.
Каким образом тогда можно изменить переменную? Для этого нужно передать адрес этой переменной. Перепишем функцию, чтобы она принимала указатель типа int

Вот теперь программа выводит
200
100
100
Здесь также была создана локальная переменная, но так как передан был адрес, то мы изменили значение переменной d, используя её адрес в оперативной памяти.

В программировании первый способ передачи параметров называют передачей по значению, второй – передачей по указателю. Запомните простое правило: если вы хотите изменить переменную, необходимо передавать функции указатель на эту переменную. Следовательно, чтобы изменить указатель, необходимо передавать указатель на указатель и т.д. Например, напишем функцию, которая будет принимать размер массива типа int и создавать его. С первого взгляда, функция должна выглядеть как-то так:

Но эта функция выведет ERROR. Мы передали адрес переменной. Внутри функции init была создана локальная переменная a, которая хранит адрес массива. После выхода из функции эта локальная переменная была уничтожена. Кроме того, что мы не смогли добиться нужного результата, у нас обнаружилась утечка памяти: была выделена память на куче, но уже не существует переменной, которая бы хранила адрес этого участка.

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

Вот теперь всё работает как надо.
Ещё подобный пример. Напишем функцию, которая принимает в качестве аргумента строку и возвращает указатель на область памяти, в которую скопирована эта строка.

В этом примере утечки памяти не происходит. Мы выделили память с помощью функции malloc, скопировали туда строку, а после этого вернули указатель. Локальные переменные были удалены, но переменная test хранит адрес участка памяти на куче, поэтому можно его удалить с помощью функции free.

Объявление функции и определение функции. Создание собственной библиотеки

В си можно объявить функцию до её определения. Объявление функции, её прототип, состоит из возвращаемого значения, имени функции и типа аргументов. Имена аргументов можно не писать. Например

Это смешанная рекурсия – функция odd возвращает 1, если число нечётное и 0, если чётное.

Содержимое файла исходного кода File1.c

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

Заголовочный файл, как и оговаривалось ранее, содержит прототип функций. Также здесь могут быть подключены используемые библиотеки. Макрозащита #define _FILE1_H_ и т.д. используется для предотвращения повторного копирования кода библиотеки при компиляции. Эти строчки можно заменить одной

Файл File1.c исходного кода подключает свой заголовочный файл. Всё как обычно логично и просто. В заголовочные файлах принято кроме прототипов функций выносить константы, макроподстановки и определять новые типы данных. Кроме того, именно в заголовочных файлах можно обширно комментировать код и писать примеры его использования.

Передача массива в качестве аргумента

К ак уже говорилось ранее, имя массива подменяется на указатель, поэтому передача одномерного массива эквивалентна передаче указателя. Пример: функция получает массив и его размер и выводит на печать:

В этом примере функция может иметь следующий вид

Также напомню, что правило подмены массива на указатель не рекурсивное. Это значит, что необходимо указывать размерность двумерного массива при передаче

Если двумерный массив создан динамически, то можно передавать указатель на указатель. Например функция, которая получает массив слов и возвращает массив целых, равных длине каждого слова:

Можно вместо того, чтобы возвращать указатель на массив, передавать массив, который необходимо заполнить

На этом первое знакомство с функциями заканчивается: тема очень большая и разбита на несколько статей.

Источник

Переменная Result в функции

Реализация языка в версии Object Pascal облегчает программирование функций путем автоматического объявления в каждой из них локальной переменной Result. Эта переменная имеет тот же тип, что и результат функции. Присваивание значения переменной Result аналогично определению значения функции. Преимущество использования этой переменной при вычислении значения функции в том, что локальная переменная Result может стоять в правой части оператора присваивания и не вызывает при этом рекурсивного вычисления функции (в отличие от идентификатора функции, появление которого в вычисляемом выражении означает рекурсивный вызов функции).

Например, представленная выше функция вычисления суммы квадратов натурального ряда может быть преобразована следующим образом: Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

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

Формальные и фактические параметры

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

Отдельные объявления параметров в списке разделяются точкой с запятой. Синтаксис списка формальных параметров следующий:

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

Все формальные параметры можно разбить на две категории:

Главное различие этих двух категорий — в механизме передачи параметров в подпрограмму. При вызове параметра по значению происходит копирование памяти, занимаемой параметром, в стек и использование в дальнейшем в операторах подпрограммы локальной копии параметра. Основное значение параметра

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

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

Объявление формального параметра обязательно содержит имя (идентификатор) параметра и, как правило, его тип, отделяющийся от имени двоеточием. Несколько однотипных параметров могут объединяться в одно объявление. При этом их имена перечисляются через запятую.

При обращении к подпрограмме формальные параметры заменяются на соответствующие по типу и категории фактические параметры вызывающей программы или подпрограммы.

Параметры-значения. Формальные параметры-значения относятся к первой из перечисленных выше категорий и действуют как переменные, локальные по отношению к процедуре или функции. Изменения формальных параметров-значений не влияют на значения соответствующих фактических параметров. Синтаксис объявления параметра-значения следующий:

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

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

Рассмотрим пример объявления функции с параметром-значением: Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

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

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

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

Рассмотрим пример объявления процедуры с параметром-переменной:

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

В результате применения этой процедуры к строке

S_Sentence: Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

будет изменено содержимое строки. Если до вызова процедуры в строке находилось значение ‘лимон, апельсин, банан’, то после вызова процедуры значение s_Sentence будет равно ‘лимон; апельсин; банан’.

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

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

Рассмотрим пример передачи параметров-переменных без типа:

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

Эту функцию можно использовать для сравнения любых двух переменных, размер которых не превышает 1000 байт. Например, в программе присутствуют следующие объявления: Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

Тогда вызов функции:

VarEqual(Vectorl, Vector2, SizeOf(Vector))

обеспечит сравнение массивов Vectorl и Vector2;

VarEqual(Vectorl, Vector2, SizeOf(Integer)*10) —

сравнение первых 10 элементов массивов Vectorl и Vector2;

Equal(Pointl, Point2, SizeOf(TPoint)) —

сравнение переменных Pointl и Point2;

Equal(Vectorl[1], Point2.Y, SizeOf(Integer)) —

сравнение значений Vectorl [ 1 ] и Point2. Y.

Параметры-константы. Формальные параметры-константы носят пограничный характер между двумя категориями. С одной стороны, это параметры, которые передаются в подпрограмму по наименованию, т. е. ссылкой на глобальное размещение фактического параметра, но, с другой стороны, внутри подпрограммы действует запрет на изменение значения параметра. Использовать параметры-константы удобно вместо параметров-значений, когда параметр характеризуется большим размером занимаемой памяти. Параметры-константы введены в описание языка только начиная с версии Turbo Pascal 7.0. Синтаксис объявления параметров-констант следующий:

Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

В рассмотренном ранее примере объявления функции с параметром-значением более эффективным будет использование параметра-константы, который обеспечит передачу в процедуру адреса размещения строки: Можно ли имя функции передавать в качестве фактического параметра. Смотреть фото Можно ли имя функции передавать в качестве фактического параметра. Смотреть картинку Можно ли имя функции передавать в качестве фактического параметра. Картинка про Можно ли имя функции передавать в качестве фактического параметра. Фото Можно ли имя функции передавать в качестве фактического параметра

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

Источник

Leave a Reply

Your email address will not be published. Required fields are marked *