Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Способи передачі параметрів




Класифікація способів передачі параметрів. Параметри підпрограми використовуються як інструмент для передачі в неї вихідних даних і повернення в основну програму (зовнішню підпрограму) отриманих результатів. Така передача у самому простому випадку може здійснюватися і за допомогою глобальних змінних зовнішнього блоку, що дозволяє говорити про процедуру без параметрів. При цьому очевидно, що процедура - це нісенітниця, якщо вона взагалі не використовує в якості вихідних даних ніяких даних з викликаючої програми і не повертає їй (або не виводить) результатів обчислень.

Загалом, параметри підпрограм розрізняються:

· за механізмом передачі -

- передаються за значенням (value);

- передаються за адресою (за посиланням) (addr);

· за способом взаємодії з підпрограмою -

- є тільки вхідним параметром (in);

- є тільки вихідним параметром (out);

- є як вхідним, так і вихідним параметром (inout).

Відповідно, теоретично можливі 6 способів передачі параметрів:

value in value out value inout
addr in addr out addr inout

Дамо коротку характеристику цих способів передачі параметрів. При цьому треба зазначити, що деякі дії є спільними для усіх шести способів. Зокрема, при реалізації будь-якого способу передачі параметрів

- у випадку виклику підпрограми виконується виділення пам'яті під формальні параметри і локальні дані (зазвичай, у стеці);

- по завершенні виконання підпрограми пам'ять, виділена під формальні параметри і локальні дані, очищається.

Особливості реалізації кожного із способів передачі параметрів представимо у вигляді таблиці:

Тип параметра При виклику підпрограми Під час роботи підпрограми По завершенню підпрограми
value in виконується копіювання значень фактичних параметрів у стек зміна значень формальних параметрів не впливає на вміст комірок пам'яті фактичних параметрів нові значення формальних параметрів, отримані в процесі роботи підпрогра-ми, губляться разом з очищенням пам'яті
value out - виконується копіювання адрес (але не значень!) фактичних параметрів у стек; - значення формальних пара-метрів безпосередньо після виклику не визначені; - використовувати константи як фактичні параметри заборонено - забороняється використовувати формальні параметри поки їм не буде присвоєне яке-небудь значення; - зміна значень формальних параметрів не викликає одночасної зміни відповід-них фактичних параметрів використовуючи скопійовані адреси фактичних параметрів, виконується запис результуючих значень формальних параметрів у комірки пам'яті фактичних параметрів
value inout - виконується копіювання як адрес фактичних параметрів, так і їхніх значень у стек; - використовувати константи як фактичні параметри заборонено - допускається як використовувати, так і змінювати значення формальних параметрів; - зміна значень формальних параметрів не викликає одночасного зміни відповідних фактичних параметрів використовуючи скопійовані адреси фактичних параметрів, виконується запис результуючих значень формальних параметрів у комірки пам'яті фактичних параметрів
addr in виконується копіювання адрес (але не значень!) фактичних параметрів у стек - заборонена зміна значень формальних параметрів; - використовувати значення формальних параметрів дозволено тільки в якості вихідних даних; - значення формальних параметрів за скопійованими адресами вибираються безпосередньо з пам'яті фактичних параметрів вплив підпрограми на викликаючу через такі параметри відсутній
addr out - виконується копіювання адрес (але не значень!) фактичних параметрів у стек; - значення формальних пара-метрів безпосередньо після виклику не визначені; - використовувати константи як фактичні параметри заборонено - забороняється використовувати значення формальних параметрів доти, поки їм не буде виконане первісне присвоювання якого-небудь значення; - зміна значень формальних параметрів за скопійованими адресами виконується безпосередньо у комірках пам'яті відповідних фактичних параметрів спеціального копіювання результатів не потрібно, оскільки результат відразу зберігається у комірках па-м'яті фактичних параметрів
addr inout - виконується копіювання адрес (але не значень!) фактичних параметрів у стек; - використовувати константи як фактичні параметри заборонено - ніяких обмежень на використання параметрів даного виду не накладається; - зміна значень формальних параметрів за скопійованими адресами виконується безпосередньо у комірках пам'яті відповідних фактичних параметрів спеціального копіювання результату не потрібно, оскільки всі дії з формальними параметрами виконувалися безпосередньо над комірками пам'яті фактичних параметрів

 

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

В мовах програмування, як правило, використовується не більше двох - трьох зазначених способів передачі параметрів. Зокрема, у мові С/С++ підтримуються такі способи передачі параметрів у функції:

- за значенням (value in);

- за адресою з аргументами-покажчиками (addr inout);

- за адресою з аргументами-посиланнями (addr inout).

Відповідно до способів передачі параметрів, що підтримуються мовами програмування, розрізняють параметри–значення, параметри–змінні, параметри–посилання, параметриконстанти.

Параметри–значення. Параметри-значення – це параметри, що передаються у підпрограму способом value in (за значеннями).

Даний спосіб передачі аргументів підпрограми передбачає створення копії значення фактичного параметра і передачі її відповідному формальному параметру. Зміна копії у тілі підпрограми не впливає на значення оригіналу в операторі виклику. Механізм передачі таких параметрів можна представити наступною схемою:

Після ініціалізації формального параметра значенням фактичного параметра, останній є недоступним з підпрограми - вона не в змозі ні змінити його, ані використати яким-небудь іншим способом.

Відповідні параметри називають параметрами-значеннями, оскільки кожен такий параметр в тілі підпрограми представляє значення відповідного фактичного параметра.

Декларування такого способу передачі параметрів у Pascal здійснюється наступним чином:

параметр-значення = ім'я {, ім'я} :тип.

Наприклад,

рrocedure Proc (par1, par2 : byte; par3 : word).

Як фактичні параметри-значення можуть використовуватися константи, змінні, вирази.

Схожим чином здійснюється оголошення параметрів-значень і у мові С. Наприклад,

void func(int);

main ( )

{ int n = 4;

n= func(n);

cout << “n = “ << n << endl;

return 0;

}

void func(int num);

{ return (num + 5) *num;

}

 

Параметри–змінні.Якщо передача параметрів відбувається за значеннями, то у тілі підпрограми не можна змінити значення змінних, що є фактичними параметрами. Однак, формальні параметри підпрограми визначають не лише дані, які передаються на обробку до підпрограми, а також дані, які повертаються підпрограмою у вигляді результатів. Такі параметри в тілі підпрограми повинні представлятися не значеннями, які є тільки вхідними даними підпрограми, а деякими змінними, що існують поза тілом підпрограми. Щоб підпрограма могла присвоїти значення таким змінним, необхідно забезпечити безпосередній доступ до них із підпрограми.

Такі можливості притаманні так званим параметрам-змінним. Параметри-змінні – це параметри, що передаються у підпрограму способом addr inout. Механізм передачі параметрів такого типу можна представити наступним чином:

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

На відміну від формального параметра-значення, фактичним параметром для якого може бути будь-який вираз відповідного типу, для параметра-змінної фактичним параметром може бути лише змінна.

Якщо деякий параметр підпрограми представляє результат її виконання, то він обов'язково повинен задаватися як формальний параметр-змінна.

Щоб відрізнити параметр-змінну від параметра-значення у мові Pascal, перед ним в списку формальних параметрів записується службове слово var. Відповідна БНФ-нотація:

параметр-змінна ::= var ім'я {, ім'я} :тип.

Наприклад,

Procedure Proc (par1, par2 : byte; var par3 : word).

У мові С для реалізації даного способу передачі параметрів треба описати відповідний формальний параметр як покажчик на деяку змінну. У цьому випадку формальному параметру передається адреса аргумента, що надає функції можливість прямого доступу до даних, які передаються, а також можливість зміни цих даних, використовуючи операцію розіменування. Наприклад,

void prim (int *);

main ( )

{ int n = 4;

prim (&n);

cout << “n = “ << n << endl;

return 0;

}

void prim (int *nPtr);

{ *nPtr = (*nPtr + 5) * *nPtr;

}

Недоліком даного споособу передачі параметрів є недостатня захищеність даних, оскільки підпрограма має доступ до них і може зіпсувати дані, що передаються до неї.

Параметри-посилання. Це різновид параметрів-змінних. Характерний такий спосіб передачі параметрів для мови С. При такій передачі відбувається пряме звертання до параметра, але через його псевдонім (інше ім’я). Механізм передачі параметрів за посиланням можна представити так:

Наприклад,

void prim (int &);

main ( )

{ int n = 4;

prim (n);

cout << “n = “ << n << endl;

return 0;

}

void prim (int &nRef);

{ nRef *= nRef ;

}

Параметри-константи.Параметри-константи – це параметри, що передаються у підпрограму за адресою способом addr in. Цейспосіб передачі параметрів використовується у мові Pascal. Механізм такої передачі параметрів можна представити наступним чином:

Для декларації такого способу передачі параметрів при описі заголовків підпрограм перед ідентифікаторами параметрів-констант ставиться ключове слово Const.БНФ-нотація:

параметр-змінна ::= const ім'я {, ім'я} :тип.

Наприклад,

Procedure Proc (const par1, par2 : byte; const par3 : word).

В якості фактичних параметрів-констант можуть використовуватися як змінні, так і константи. Однак, забороняється виконувати присвоювання формальним параметрам-константам і формальні параметри-константи не можуть передаватися як фактичні параметри іншим підпрограмам.

Параметри-константи доцільно використовувати у випадках, коли потрібно передавати структури даних, які займають великий об’єм пам'яті, але змінювати вихідні значення параметрів з алгоритмічної точки зору неприпустимо. У результаті економно використовується ОП і одночасно гарантується цілісність вихідних даних.

Алгоритм реалізації виклику підпрограми. Узагальнимо процес виконання виклику підпрограми:

1. В стеці виділяється пам'ять під процес виконання виклику підпрограми.

2. Обчислюється й запам'ятовується у відповідній пам'яті підпрограми точка повернення в основну програму.

3. Обчислюються значення аргументів, що відповідають параметрам-значенням, і адреси пам'яті аргументів, що відповідають параметрам-змінним. Виконується підстановка аргументів.

4. Виконуються оператори тіла підпрограми. У стеці запам'ятовується значення, що повертається як результат виклику функції.

5. Значення змінної з ім'ям функції копіюється з локальної в пам'ять основної програми. Процес виконання виклику підпрограми закінчується і продовжується виконання основної програми із точки повернення.

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

Слід зауважити, що не може бути повної незалежності між підпрограмами. Залежність між ними існує:

- через списки параметрів;

- тоді, коли вони користуються спільними (глобальними) змінними;

- всі блоки програми залежать від структури даних цієї програми;

- підпрограми залежать від логіки функціонування програми (від того фактору, що підпрограма може викликатися іншими підпрограмами).

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

Із сказаного вище випливає, що не слід без крайньої необхідності використовувати в підпрограмах глобальні змінні. Всі зв’язки між підпрограмами повинні підтримуватися через списки параметрів.

 


Поделиться:

Дата добавления: 2015-08-05; просмотров: 380; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты