Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Безтипові параметри

Крім двох звичайних способів передачі параметрів у підпрограми при їхньому виклику - за значенням і по посиланню - Turbo Pascal допускає третій спосіб передачі, при якому тип параметра не фіксується. У цьому випадку специфікація формального параметра в заголовку підпрограми має наступний загальний вид:

var Ident,

де Ident - ідентифікатор формального параметра.

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

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

Приведення типів.

Turbo Pascal, на відміну від авторської версії мови, містить спеціальну конструкцію явного перетворення типу. Ця конструкція зветься приведення типу змінної. Приведення не здійснює ніяких операцій з змінної (як, наприклад, операції Round чи Trunc), а просто дозволяє трактувати змінну одного типу, як змінну деякого іншого типу. Загальний вид приведення типу наступний:

ТИП (ЗМІННА)

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

var

SI : 0..255;

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

SI := 'А'

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

char(SI) := 'A'

Конструкція приведення типу може знаходитися у всіх позиціях, у яких допускається входження змінної. При цьому слід пам'ятати, що тип даної конструкції завжди визначається ідентифікатором типу перед дужками. Крім того, варто враховувати, що розмір змінної (число байтів, які займає ця змінна) ПОВИНО БУТИ РІВНИМ розміру типу, ідентифікатор якого зазначений у приведенні.

Наведемо ще один приклад. Нехай мається такий опис:

type

Days = (Monday,Tuesay,Wednesday,Thursday,Friday, Satuday,Sunday);

var

aDay : Days;

Num : byte;

Тоді припустимі такі оператори:

Days(Num) := Monday; { Num = 0 }

aDay := Days(Num); { aDay = MonDay }

Num := byte(Friday); { Num = 4 }

Зверніть увагу, що еквівалентом останнього присвоювання буде наступне:

Num := Ord(Friday);

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

aDay := Days(Num+l);

Num := byte(Pred(Friday));

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

var

li: longint;

I : integer;

begin

LI := 1234567;

I := integer (li+1) ;

Writeln(I)

end.

приведе до виведення на екран значення -10616 (значення типу longint у процесі приведення до типу integer буде "обрізане").

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