Мегаобучалка Главная | О нас | Обратная связь  


Процедуры преобразования




STR (X; Var S : String) – преобразует числовое значение Х в строковое S, возможно задание формата для Х (Str(X:F:n,S) – F – общая ширина поля, n – количество символов в дробной части для вещественных чисел) (процедура);

VAL (S : String; Var X; Var Code : Integer) – преобразует строковое значение S (строку цифр) в значение числовой переменной (Х – целое или вещественное, параметр Code содержит ноль, если преобразование прошло успешно, в противном случае он содержит номер позиции в строке, где обнаружен ошибочный символ, при этом Х не меняется) (процедура).

Имеется возможность применить операции отношения (= <> > < >= <=) к двум строкам. При этом сравнение строк производится посимвольно, начиная с первого символа в строке. Строки равны, если имеют одинаковую длину и посимвольно эквивалентны. Если при посимвольном сравнении окажется, что символ первой строки больше символа второй (имеется в виду их коды), то первая строка считается большей. Остатки строк и их длины не играют роли. Любой символ больше «пустого». Например, 'aBcd’ < ‘ab’, т.к. ‘B’ (код 66) < ‘b’ (код 98).

 

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



 

СОВМЕСТИМОСТЬ И ПРЕОБРАЗОВАНИЕ ТИПОВ

Если в программе объявлены переменные, то подразумевается, что они будут получать свои значения по ходу ее выполнения. Способ поместить значение в переменную – это использовать операцию присваивания:

Переменная := Значение;

Оператор присваивания – это составной символ «:=» (становится равным). В операции присваивания слева стоит имя переменной, а справа – то, что представляет собой ее значение (значение как таковое (константа), выражение, вызов функции, другая переменная). После выполнения операции присваивания переменная получает новое значение.

ТР, являясь языком с сильной системой типов, требует соблюдения определенных правил совместимости типов переменных и значений слева и справа от оператора присваивания.

Очевидно, что не может быть проблем с присваиванием, если типы переменной и значения идентичны (тождественны). Два типа считаются тождественными, если

1. Они описаны вместе, либо одним и тем же идентификатором типа, например

Type

T1 = Boolean;

T2 = Boolean;

T3, T4 = array[1..2] of Real;

Если T1 = array [1..2] of Real и T2 = array [1..2] of Real, то Т1 и Т2 не будут идентичными поскольку конструкции array .. of .. хоть и одинаковые, но не являются идентификаторами, т.е. именами.

2. Типы описаны как эквивалентные. Т.е. при описании

Type

T1 = array [1..2] of Real;

T2 = T1;

T3 = T2;

все типы Т1,Т2,Т3 будут тождественны.

Однако не только тождественные типы являются совместимыми. Прежде, чем рассматривать совместимость по присваиванию, рассмотрим более общее понятие. Совместимость в ТР трактуется несколько шире. Типы считаются совместимыми, если

- оба типа являются тождественны;

- оба типа являются вещественными;

- оба типа являются целыми;

- один тип является поддиапзоном другого;

- оба типа являются поддиапазонами одного и того же базового типа;

- оба типа являются множествами, составленными из одного и того же базового типа;

- один тип является строковым, а другой символьным или строковым;

- один тип является указателем, а другой указателем или ссылкой.

Совместимость гарантирует работу операций отношения (но не оператора присваивания). Кроме того, что важно, совместимость определяет правила подстановки значений или переменных в вызовы функций и процедур.

Если говорить о операции присваивания, то в ТР существует еще один вид совместимости – совместимость по присваиванию. Этот вид описывает правила присваивания переменной какого-то значения. Имеется переменная V1 : Type1 и значение V2, которое относится к типу Type2. Переменной может быть присвоено значение (V1 := V2), если выполняется одно из следующих условий:

- Type1 и Type2 тождественные типы, и не один из них не является файловым типом (или структурным типом, содержащим компонент с файловым типом);

- Type1 и Type2 совместимые типы (в смысле, рассмотренном ранее), относящиеся к порядковым, и значения типа Type2 попадают в диапазон возможных значений Type1;

- Type1 и Type2 – вещественные типы и значения типа Type2 попадают в диапазон возможных значений Type1;

- Type1 – вещественный тип, Type2 – целочисленный тип;

- Type1 и Type2 – строковые типы;

- Type1 – строковый тип, Type2 – символьный тип;

Есть еще 4 правила, относящихся к множествам, указателям и объектам.

- Type1 и Type2 совместимые множества и все члены значения множества типа Type2 попадают в диапазон возможных значений Type1;

- Type1 и Type2 совместимые адресные типы;

- Тип объекта Type2 совместим по присваиванию с типом объекта Type1, если Type2 находится в области типа объекта Type1.

- Тип ссылки Ptr2, указывающий на тип объекта Type2, совместим по присваиванию с типом ссылки Ptr2, указывающим на тип объекта Type1, если Type2 находится в области типа объекта Type1.

Нарушение правил совместимости типов переменных и значений обнаруживается, как правило, на этапе компиляции.

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

При явном преобразовании используются вызовы специальных функций, аргументы которых принадлежат одному типу, а значения (результат) другому. Таковыми являются, например, уже рассмотренные функции ORD, TRUNC, CHR…

В ТР, кроме того, имеется специальное мощное средство, позволяющее обойти возможные ограничения на совместимость типов или значений. Механизм заключается в том, что в ту область памяти, которую занимает переменная некоторого типа, можно поместить некоторое значение другого типа, если только длина внутреннего представления вновь размещаемого значения в точности равна длине внутреннего представления переменной. Для этого используется функция преобразования, которая совпадает с именем типа, к которому должна быть приведена переменная. Например,

Type

M2Word = array[1..2] of Word;

M4Byte = array[1..4] of Byte;

Var

V1 : M2Word;

V2 : M4Byte;

V3 : LongInt;

V4 : Word;

Begin

V3 := 100;

V1 := M2Word(V3);

V2 := M4Byte(V3);

V4 := Word(V1[1]);

End.

Переменные V1,V2,V3 в памяти занимают 4 байта, переменная V4 - 2 байта. Сначала задаем значение переменной V3. Две следующие строки помещают значение LongInt либо в два слова, либо в четыре байта. В данном примере V1[1]=100, V1[2]=0, т.к. длина значащих двоичных разрядов в V3 меньше, чем длина Word. Если будет больше, то такого соответствия не будет, т.к. число будет разбито на два в двоичном представлении. Затем первый элемент массива V1 помещается в переменную V4. Т.о. данный метод позволяет нарушить правила совмещения типов при условии, что соответствующие значения совместимы в машинном представлении. Приведение типа переменной может стоять как слева, так и справа M2Word(V3)[2] := 3. При этом V3 состоит из двух байтов: младший 0..01100100 = (100)10, старший 0..00000011 = (3)10, в сумме 0..00000011 0..01100100 = (196708)10;

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

Например, Integer('Y') - код символа 'Y' в формате Integer. Этот символ хранится как код 89 и занимает один байт. Конструкция Integer('Y') представляет собой значение 89 в формате целого числа со знаком (в двух байтах). При преобразовании типа значения соблюдение размеру уже не нужно. Новый тип может быть шире, а может быть короче, чем естественный тип значения. При приведении значения в более широкий тип значения будут целиком записаны в младшие байты, что естественно сохранит само значение. Когда значение приводится к более короткому типу, от него берутся только самые младшие байты, старшие игнорируются. Преобразование типа значения внешне похоже на преобразование типа переменной. Но эффект от него несколько иной (за счет возможности изменения размера), и иные ограничения. В частности тип значения и задаваемый тип должны быть порядковыми. Кроме того, преобразование значения не может появиться в левой части.

Неявное преобразование возможно в двух случаях:

1. В выражениях, составленных из вещественных и целочисленных переменных, последние автоматически преобразуются к вещественному типу, и все выражение в целом приобретает вещественный тип;

2. Одна и та же область памяти попеременно трактуется как содержащая данные то одного, то другого типа (совмещение в памяти данных разного типа).

Совмещение данных в памяти, в частности, возможно при явном размещении данных разного типа по одному и тому же абсолютному адресу (а также при использовании записей с вариантными полями, типизированных указателей, содержащих одинаковый адрес). Для размещения переменной по нужному абсолютному адресу она описывается с последующей стандартной директивой ABSOLUTE, за которой помещается либо абсолютный адрес, либо имя ранее определенной переменной (Адрес указывается парой чисел типа Word, разделенных двоеточием; первое трактуется как сегмент, второе как смещение (вся память 1 Мбайт для ТР 7.0 разбивает на сегменты длиной 65536 байт (64К), каждому сегменту соответствует непрерывная и отдельно адресуемая область памяти. Сегменты могут следовать один за другим без промежутков или с некоторым интервалом, или перекрывая друг друга. Сегменты адресуют память с точностью до 16 байт, а смещение с точностью до байта): w : LongInt absolute 128:0. При таком описании переменной ее значение помещается в определенную область памяти. Затем эту область памяти уже можно рассматривать как переменную другого типа. Это бывает удобно, когда есть желание использовать некоторую функцию (или процедуру) применительно к переменным различного типа.

Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Читайте также:



©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (103)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.024 сек.)
Поможем в написании
> Курсовые, контрольные, дипломные и другие работы со скидкой до 25%
3 569 лучших специалисов, готовы оказать помощь 24/7