3. Типове данни
29
3.3. Динамични структури от данни
При досега разгледаните структури от данни компилаторът отделя място в
паметта за тяхното представяне по време на компилация. Тези структури често се
наричат статични. Разликата между тях и динамичните структури не е главно в това, че
паметта за динамичните структури се отделя по време на изпълнение, а в това, че те
(динамичните структури) обикновено се използват за представяне на рекурсивни
структури от данни, т.е. на структура която включва себе си (явно или неявно) в своето
определение. По тази причина големината на такава структура е неизвестна по време
на компилация и даже нещо повече - тя обикновено се мени по време на изпълнение
(рекурсивността на динамичните структури не е задължителна, но тя е най-
същественото различие между двата типа структури от данни).
В Pascal динамичните структури от данни са реализирани чрез указатели. Общият
вид на описанието на типа указател е:
PointerType =
'^' TypeIdent.
Идентификаторът на типа, към който сочи указателният тип (този тип се нарича
базов тип за указателния), може да бъде дефиниран след дефиницията на указателния
тип, но в рамките (т.е. до края) на текущия раздел за дефиниране на типове.
Множеството от стойности на всеки указателен тип се създава динамично по
време на изпълнение, но за всички указатели е дефинирана стойността NIL, която се
интерпретира като указател, който не сочи към никакъв елемент. В UniPascal е
дефиниран стандартен тип Pointer, съвместим със всички указателни типове. Неговите
стойности се интерпретират като указатели, сочещи към обекти без тип.
Над указателите са дефинирани операциите: даване на стойност (:=), сравнение
за равенство (=) и различие (<>) и следните стандартни процедури: NEW - за създаване
на нов обект и DISPOSE - за унищожаване на съществуващ обект. Дефинирани са и
няколко процедури за работа с динамичната памет (паметта, която се използува за
разполагане на динамичните променливи): GETMEMWORDS, FREEMEMWORDS, MARK
и RELEASE.
Процедурите MARK и RELEASE са предвидени като заместители на процедурата
DISPOSE в някои реализации на Pascal, но те се оказват удобни за работа и затова са
реализирани и тук. Кой от двата метода: MARK-RELEASE или DISPOSE, ще бъде
използван за освобождаване на заета памет е въпрос на конкретна необходимост и
организацията на данните в програмата. Използуването и на двата метода в една и съща
програма не е препоръчително и може да доведе, в най-лошия случай, до
неосвобождаване на част от заетата памет (за подробности виж UniPascal в детайли).
3.4. Идентичност и съвместимост на типовете
При съставянето на програми е необходимо да се знае какви са отношенията на
променливи, принадлежащи към различни типове. Досега винаги подчертавахме, че над
даден тип са приложими някакви операции. Но не споменавахме дали може да имаме
смесване на променливи от различни типове. За програмистите обикновено е
интуитивно ясно кои типове могат да бъдат смесвани (т.е. са съвместими) и кои не. За
компилатора, от друга страна, е строго дефинирана тази съвместимост.
В Pascal, както беше споменато по-рано, е в сила силната типизация, но тя има
две основни свои разновидности - структурна и именна. Най-общо казано, при
структурната два типа са съвместими, ако имат еквивалентна структура, а при именната
няма съвместимост между два различни типа, т.е. при именна типизация всеки два
различни типа са несъвместими. В по-ранните реализации на Pascal поради липса на
<<  <  GO  >  >>

Вернуться к началу сайта