8. Съвместимост и тип преобразуване

8.1. Типова съвместимост

Turbo Pascal е типизиран език. Той е изграден на базата на стриктно спазване на концепцията за типовете, според която всички операции, използвани в езика, се дефинират само върху операнди от съвместими типове.

Определяне на типовата съвместимост.

Два вида се считат за съвместими, ако:

и двете са от един и същи тип;

единият тип е типът обхват на втория тип;

и двата са типове обхват от един и същ базов тип;

и двата са набори, съставени от елементи от един и същи основен тип;

и двете са опаковани низове (дефинирани с предхождаща PACKED дума) с еднаква максимална дължина;

единият тип е тип низ, а другият е тип низ, низ в кутия или знак;

единият тип е всеки указател, а другият е нетипизиран указател;

единият тип е указател към обект, а другият е указател към свързан обект;

и двата са процедурни типове с един и същ тип резултат (за тип функция), брой параметри и тип взаимно съвпадащи параметри.

Съвместимостта на типове придобива специално значение в операторите за присвояване. Нека T1 е типът на променливата и T2 типът на израза, т.е. изпълнява се присвояването T1 :=T2. Това възлагане е възможно в следните случаи:

T1 и T2 са от един и същи тип и този тип не се отнася за файлове или масиви от файлове, или записи, съдържащи файлови полета, или масиви от такива записи;

T1 и T2 са съвместими ординални типове и стойността на T2 е в обхвата на възможните стойности за T1;

T1 и T2 са реални типове и стойността на T2 е в обхвата на възможните стойности на T1;

T1 е реалният тип, а T2 е целочисленият тип;

T1 - низ и T2 - знак;

Т1 - низ и Т2 - опакован низ;

T1 и T2 са съвместими опаковани низове;

T1 и T2 са съвместими набори и всички членове на T2 принадлежат към множеството от възможни стойности на T1;

T1 и T2 са съвместими указатели;

T1 и T2 са съвместими процедурни типове;

T1 е обект, а T2 е негово дете.

Силната дисциплина на типа е несъмнено предимство на езика Pascal, тъй като несъответствията на типа в определени ситуации могат да доведат до неправилна работа на програмата и откриването на грешки от този вид в програмата често е много, много трудно. Нарушаването на правилата за съвместимост на типове обикновено се открива по време на компилиране и е придружено от съобщениеНесъответствие на типа..

8.2. Преобразуване (преобразуване) на типове и стойности

В една програма данните от един тип могат да бъдат преобразувани в данни от друг тип. Такова преобразуване може да бъде изрично или косвено.

8.2.1. Изрично преобразуване на типове и стойности

Явното преобразуване на типове използва извиквания към специални функции за преобразуване, чиито аргументи са от един тип и чиято стойност е от друг тип. Това са вече разгледаните функции ORD, TRUNC, ROUND, CHR.

Turbo Pascal може също да използва по-общ механизъм за преобразуване на типа, според който преобразуването се постига чрез прилагане на идентификатора (име) на стандартен тип или дефиниран от потребителя тип като идентификатор на функцията за преобразуване към израза на типа, който се преобразува.

Нека например типовете typel и type2 имат еднакъв размер (заемат еднакъв брой байтове в паметта). Да предположим, че x е променлива от тип typel и y е променлива от тип2. И накрая, нека приемем, че на x е присвоена стойност. След това въведете кастинг

просто интерпретираданните, съхранени в x като стойност от тип type2, посочена с име y. По-специално, ако N е от тип Byte и ch е от тип Char, тогава следните оператори за присвояване са валидни:

В Pascal също е позволенопреобразуването на стойностен тип. Типът стойност изглежда така:

където TypeID е идентификаторът на типа, а в скоби е изразът израз, който може да бъде само константа. Имайте предвид, че типът на израза и типът, който се указва, трябва да бъдат изброени типове или указатели. За изброените типове получената стойност се получава чрез преобразуване на израза и проверка дали е в разрешените граници. Преобразуването може да съкрати или увеличи размера на оригиналната стойност, ако полученият тип е различен от типа на израза. Когато една стойност се разшири, нейният знак винаги се запазва. Преобразуване на тип стойност не трябва да се появява от лявата страна на оператор за присвояване.