Способи підстановки аргументів

Процедури та функції

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

Оголошення та опис. 2

Оголошення функції. 2

Оголошення процедури.. 2

Опис підпрограми.

Список параметрів. 3

Значення, що повертаються. 4

Виклик підпрограм.. 5

Способи підстановки аргументів. 6

Механізм передачі значення. 6

Механізм передачі значення. 7

Механізм передачі значення. 8

Області дії імен. 8

Розмежування контекстів. 8

Побічний ефект. 9

Збіг імен. 9

Нетипізовані параметри.

Явне перетворення типу. 10

Поєднання пам'яті. 10

Відкриті параметри.. 11

Відкриті масиви.. 11

Відкриті рядки. 11

Процедурний тип даних. 12

Підпрограми

Досить поетичне пояснення поняття підпрограма дав В.Ф. Очков: "Підпрограма - це приспів пісні, який співають кілька разів, а в текстах пісень друкують лише один раз".

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

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

Таким чином, підпрограма – це насамперед програма. З усіма повноцінною програмою атрибутами: ім'ям, розділами опису міток (label), констант (const), типів(type), змінних (var) і навіть зі своїми (вкладеними) функціями та процедурами.

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

Оголошення та опис

Підпрограми оголошуються та описуються на початку Pascal-програми, до ключового слова begin, що означає початок тіла програми.

Оголошення функції

Функції оголошуються так:

Оголошення процедури

Процедури слід оголошувати так:

Опис підпрограми

end; (* Кінець тіла підпрограми *)

procedure err(c:byte; s:string);

Список параметрів

Список параметрів може бути зовсім відсутнім:

function func1: boolean;

У цьому випадку підпрограма не отримує жодних змінних "ззовні". Згаданий на початку лекції пісенний приспів якраз і є прикладом підпрограми, до якої не передається жодних даних під час виклику.

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

Якщо ж параметри є, кожен з них описується за наступним шаблоном:

Про можливі способи підстановки значень параметри ( , var, const ) миРозкажемо у розділі "Способи підстановки аргументів".

Якщо спосіб встановлення і тип декількох параметрів збігаються, опис цих параметрів можна об'єднати:

Приклад опису всіх трьох способів підстановки:

function func2(a,b:byte;var x,y,z:real;const c:char):integer;

У заголовку підпрограми можна вказувати лише прості (не складові) типи даних. Отже, спроба записати

procedure proc2(a: array[1..100]of char);

type arr = array[1..100] of char;

procedure proc2(a: arr);

function func2(var x: string): arr;

Повертані значення

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

Для повернення результату застосовується спеціальна "змінна", що має ім'я, що збігається з ім'ям самої функції. Оператор присвоювання значення цієї "змінної" обов'язково має зустрічатися в тілі функції хоча б один раз.

function min(a,b: integer): integer;

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

Виклик підпрограм

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

При виклику в підпрограму передаються фактичні параметри або аргументи (у круглих дужках після імені підпрограми, розділені комами):

Аргументами можуть бути змінні, константи і вирази, що включають виклики функцій.

Кількість і типи аргументів, що передаються в підпрограму, повинні відповідати кількості та типам її параметрів. Крім того, тип кожного аргументу маєобов'язково враховувати спосіб підстановки, вказаний для відповідного параметра (докладніше про це буде розказано у розділі "Способи підстановки аргументів"). Якщо у підпрограми взагалі немає оголошених параметрів, то при виклику список аргументів, що передаються, буде відсутній разом з дужками, що обрамляють його.

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

якщо min (z, min (x, y)) = 0 then. ;

Процедура нічого не повертає явно, тому її виклик є окремим оператором у програмі. Наприклад:

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

Способи підстановки аргументів

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

Параметр-значення

Опис

У списку параметрів підпрограми перед параметром значенням службове слово відсутнє. Наприклад, функція func3 має три параметри-значення:

function func3(x:real; k:integer; flag:boolean):real;

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

dlina:= func3(shirina/2, min(a shl 1,ord('y')), true)+0.5;

Для типів даних тут не обов'язково суворий збіг (еквівалентність), достатньо і сумісності з присвоєння (див. лекцію 2).

Чи не знайшли те, що шукали? Скористайтеся пошукомгугл на сайті: