Лекція №26
Тема: Перетворення типів
У мові Паскаль типи даних задають статично, і загалом не допустимо їх змінювати в процесі виконання програми. Однак Турбо Паскаль допускає в певних межах такі перетворення, які треба задавати в явному вигляді.
Є три способи задавати перетворення типів: неявні перетворення, використання стандартних функцій і явні перетворення. Перші два визначені в авторській версії мови Паскаль, а третій - у Турбо Паскалі.
Спосіб неявного перетворення допустимий тільки в операції присвоєння, коли, наприклад, дійсній змінній присвоюється ціле. В другому способі для перетворення типів використовують такі функції: odd, trunc, round, ord, chr. Правила їх застосування розглянуті під час вивчення відповідних типів даних, з якими вони оперують.
Явне перетворення типів у Турбо Паскалі використовує спеціальну конструкцію. Загальний вигляд перетворення типу такий:
<тип>(<змінна>)
Тобто для надання змінній іншого типу потрібно взяти її в дужки, зазначити перед дужками ім'я нового типу. Розглянемо цей спосіб перетворення типу змінної на прикладі. Нехай деяка змінна описана, як
var і: byte;
Присвоєння їй значення
і:='I'
призведе до помилки - невідповідності типів. Таке присвоєння можна виконати тільки за допомогою конструкції явного перетворення типів:
char(i):='I'.
Цю конструкцію можна використовувати в усіх позиціях, де є змінна. Треба враховувати, що розмір змінної (тобто кількість байтів для її розміщення) повинен збігатися з розміром типу, ім'я якого зазначене перед дужками.
Аналогічно до перетворення типу змінної можна використовувати перетворення типу виразу. Вираз, записаний у круглих дужках, зводиться до типу, ідентифікатор якого зазначений перед дужками. Тип виразу в дужках та ідентифікатор типу перед дужками повинні бути або дискретними, або вказівними типами. Якщо один дискретний тип зводиться до іншого, то таке перетворення може призвести до урізання або збільшення ємності пам'яті порівняно з початковою. У цьому випадку може бути спотворення значення виразу.
Зазначимо, що перетворення типів можливе тільки для простих (скалярних) і вказівних типів.
Вказівні типи вважають різними відповідно до загальних правил, хоча значення вказівних змінних визначають адреси в оперативній пам'яті. Зокрема, типи, описані як
type
р=^геаl;
q=^integer;
визначають різні множини значень, і змінні
var
s:p;
j:q;
не можуть передавати одна одній значення, наприклад, шляхом присвоєння. Якщо ж
var
s, j: р;
то можна записати s:=j.
Для вказівних типів допустимі конструкції явного перетворення. Наприклад, задано такі описи:
type rac=record
re, im: real
end;
rrac=^rac;
LL=^longint;
var
v1: rrac;
v2: LL;
Тут v1, v2 є вказівниками на значення різних типів. Однак конструкція перетворення типу дасть змогу трактувати їх як вказівники на однаковий тип:
rrac(v2)^.re:=5.7; LL(v1)^:=729364.