CFA LogoCFA Logo Computer
Загрузка поиска
Новости Компьютеры Прайс-лист [Новое] Прайс-лист [Б/У] Для ноутбуков Конфигуратор ПК Заказ, Оплата, Доставка Сервис объявления Драйвера Статьи Как нас найти Контакты
Новости
RSS канал новостей
Тайваньская компания MSI осуществила сегодня анонс фирменной модели графического ускорителя GeForce ...
Компания Manli опубликовала официальный пресс-релиз, посвященный своей новой видеокарте. Энтузиастам ...
Компания Sony накануне раскрыла некоторые подробности доступности своего нового флагманского смартфона ...
В списке новинок формата фаблет японская компания Sony готовит нового флагмана, который в настоящее ...
Компания Acer сделала наконец официально доступным свой новый ноутбук, рассчитанный на профессиональных ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мысли о Паскале

Владислав ДЕМЬЯНИШИН nitromanit@mail.ru

(Продолжение, начало см. в МК № 46, 51—52, 4 (165, 170—171, 175))

Типизированые константы

Дополнительно к обычным константам Turbo Pascal допускает использование качественно новых объектов — типизированных констант. Типизированные константы — это просто переменные, которые описываются вместе с обычными константами и, подобно обычным константам, получают начальное значение. Аналогично переменным, типизированные константы имеют тип, который задается при их описании, а также могут принимать НОВЫЕ значения (например, посредством оператора присваивания). Таким образом, термин «константа» в данном случае достаточно условен. Такие константы можно использовать точно так же, как и обычные переменные таких же типов.

Прежде чем привести пример, хочу сказать пару слов о стандартной функции WriteLn. В Turbo Pascal есть функция Write, которая выводит на экран значение аргумента, указанного в ней. Иначе говоря, строка write(‘Привет!’) выдаст в текущей позиции экрана строку «Привет!», а результатом write(MyVar) будет строка с числовым значением переменной MyVar, находящаяся в текущей позиции экрана. Так вот, функция WriteLn выполняет то же самое что и функция Write, но после вывода строки на экран переводит текущую позицию экрана (курсор, каретку) на следующую строку. Я буду использовать в примерах функцию WriteLn, чтобы выводить результаты примеров на экран.

Примеры описания типизированных констант:

Типизированные константы инициализируются ТОЛЬКО ОДИН раз — вначале выполнения всей программы. Таким образом, при каждом новом вызове в какую-либо подпрограмму (процедуру, функцию), описанные в ней типизированные константы заново не инициализируются. Простой пример для демонстрации вышесказанного:

Когда текст программы набран в окне редактирования, его можно сохранить на диск. Для этого надо нажать F2 и в появившемся окне Save File As набрать имя, под которым следует сохранить данную программу, например «example», и нажать Enter. В результате мы увидим в заголовке окна редактирования название нашей программы —example.pas.

Теперь нам нужно запустить эту программу на выполнение, нажав клавиши Ctrl+F9. Но вот что получается: при запуске программы Example экран на мгновение гаснет, и снова мы видим на экране все то же окно редактирования программы. А где же результаты выполнения? Чтобы увидеть результат выполнения этой программы, следует нажать клавиши Alt+F5. Вот что мы увидим на экране:

Рассмотрим полученный результат. В первой строке значение константы Max равно ее начальному (инициализированному) значению. Во второй строке значение уже другое, так как в процедуре MyFirst в типизированную константу заносится значение 2010. В третьей строке значение константы Max не изменилось, хотя, наверное, кто-то из читателей, затаив дыхание, все же надеялся, что при повторном вызове подпрограммы MyFirst константа Max будет вновь инициализирована значением 1000. И в последней строке, естественно, значение опять будет 2010. Ну, что я вам говорил — константы, описанные в подпрограммах, при повторном вызове подпрограммы заново не инициализируются. А кто сомневался — выходи по одному :-).

Чтобы вернуть окно редактирования на экран, следует повторно нажать клавиши Alt+F5.

Константы простых, строковых, ссылочных и процедурных типов

Описание типизированных констант с простым типом достаточно прозрачно, например:

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

то аналогичное использование типизированных констант не допускается. Так, НЕКОРРЕКТНЫМ является следующее описание массива:

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

Описания констант строкового типа также достаточно очевидны:

Для констант указательных (ссылочных) типов допустима инициализация путем задания константного выражения ссылочного типа («адресного выражения»), т. е. такого выражения, которое может быть вычислено при компиляции программы и значение которого имеет ссылочный тип, например:

Т. е. мы описываем константу-указатель на переменную, которая уже существует.

Аналогично, типизированные константы процедурных типов должны инициализироваться идентификаторами подпрограмм, совместимых по присваиванию с типом константы, например:

Константы типа «массив»

Для типизированных констант регулярных типов в качестве начального значения необходимо задать изображение массива, которое строится из списка изображений элементов массива, разделяемых запятыми. Весь список заключается в круглые скобки, например:

или

Допускается определение типизированной константы как многомерного массива. В этом случае подмассивы-элементы многомерного массива заключаются в отдельные круглые скобки.

Например, описание

С оператором For я немного забежал вперед. Таким образом мы попытаемся вывести на экран содержимое инициализированного массива-константы, перебирая все элементы этого массива. После запуска этой программы-примера (клавиши Ctrl+F9) получим на экране результат (клавиши Alt+F5):

Помните, что массив должен быть проинициализирован целиком, т. е. число элементов изображения массива и количество элементов в описании типа массива должны быть равны.

Константы типа «запись»

Начальные значения для констант комбинированных типов задаются в виде списка пар вида «идентификатор поля записи — значение поля записи». Элементы пар разделяются двоеточием, пары отделяются друг от друга точкой с запятой, а весь список пар заключается в круглые скобки:

или

или

Поля должны указываться в том же порядке, в котором они следуют в определении типа записи. Должны быть проинициализированы все поля.

Константы типа «множество»

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

Примеры:

или

Константы объектового типа

Начальные значения для констант объектовых типов задаются точно так же, как и начальные значения для комбинированных типов. При этом методы объектовой константы инициализировать не надо. Кроме того, если тип объектовой константы содержит виртуальные методы, то для такой константы не нужно вызывать метод ее конструктора (что является обязательным для объектовых переменных с виртуальными методами), так как компилятор обеспечит автоматическое выполнение конструктора. Подробнее об объектовых типах будет сказано в главе Таблица.«Средства объектно-ориентированного программирования».

Преобразование типов. Совместимость типов

Статическое определение типа переменной, вообще говоря, не позволяет задавать динамическое изменение ее типа в процессе выполнения программы. Однако, практические потребности конкретных задач вызывают необходимость преобразовать значение переменной одного типа в некоторое «эквивалентное» значение другого типа.

Использование стандартных функций преобразования типов

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

Пример:

Этот код выдаст на экран такой результат:

Итак, число 5 нечетное, и потому в первой строке имеем True, а во второй строке, соответственно, False, так как число 6 четное. Затем — 112, как результат округления числа 112.327 методом отсечения дробной части. Ну, процесс округления числа 52 в комментариях не нуждается — чего его округлять, когда оно целое? — но пускай для примера будет :-). Потом опять-таки 112 как результат округления 112.327 до ближайшего целого — тут ничего интересного. А вот 113 от числа 112.727 — совсем другое дело. В следующей строке имеем результат 0, так как в переменную MyDay было занесено значение Mon (понедельник), которое соответствует нулю, так как идет первым в описании типа TDay, а все элементы перечислимых типов нумеруются начиная с нуля. Дальше стоит число 4, ведь в переменную MyDay было записано значение Fri (пятница), которое соответствует числу 4. В следующей строке аналогичным образом появляется число 1, соответствующее Tue (вторник). Число 65 соответствует коду ASCII латинского символа A и, естественно, наоборот, символ A можно получить с помощью конструкции Chr(65). Ну, и для полной ясности выясним, каким числам соответствуют идентификаторы-константы True(1) и False(0) —исходя из этого, при сравнении двух булевских выражений True всегда будет больше чем False.

Явные преобразования

Существует специальная конструкция явного преобразования типа. Эта конструкция носит название приведения типа переменной. Приведение не осуществляет никаких операций с переменной (как, например, операции Round и Trunc), а просто позволяет трактовать переменную одного типа как переменную некоторого другого типа.

Общий вид приведения типа следующий:

Например, пусть имеется целая переменная Simb со следующим описанием:

Если необходимо присвоить этой переменной значение символьного типа, то присвоение вида

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

Здесь мы трактуем переменную Simb как переменную символьного значения, т. е. в данном выражении левая и правая части могут быть приравнены.

Конструкция приведения типа может находиться во всех позициях, в которых допускается вхождение переменной. При этом нужно помнить, что тип данной конструкции всегда определяется идентификатором типа перед скобками. Кроме того, следует учитывать, что размер переменной (число байтов, занимаемых этой переменной) ДОЛЖЕН БЫТЬ РАВЕН размеру типа, идентификатор которого указан в приведении.

Приведу еще один пример. Пусть имеются следующие описания:

Тогда допустимы такие действия:

Обратите внимание, что эквивалентом последнего присваивания будет следующее:

Можно приводить тип не только переменных, но и произвольных выражений:

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

приведет к выводу на экран значения –10616 (т. е. значение типа longint (размер — 4 байта) в процессе приведения к типу integer (2 байта) будет «урезано» с 4 байт до 2 байт).

В том случае, если значение расширяется (т. е. приводится к большему по размерам типу), его знак всегда сохраняется.

Эквивалентность типов

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

Два типа T1 и T2 являются эквивалентными, если выполняется одно из двух условий:

T1 и T2 представляют собой ОДИН И ТОТ ЖЕ идентификатор типа, например:

• Тип T2 описан с использованием типа T1 с помощью непосредственного равенства вида

или посредством цепочки таких равенств

Типы T1 и T2 являются эквивалентными, так как T2 описан непосредственно через T1; тип T3 эквивалентен T1, так как он описан через T1 посредством цепочки равенств.

Данное определение налагает достаточно жесткие ограничения. Так например, для следующих описаний:

типы A1 и A2 НЕ ЯВЛЯЮТСЯ эквивалентными, так как они не удовлетворяют приведенному определению (один тип не описан через другой). Две переменные, описанные так:

имеют эквивалентные типы, поскольку их описания нераздельны. С другой стороны, описания

означают, что типы переменных V3 и V4 эквивалентны, а типы переменных V1 и V2 не эквивалентны ни друг другу, ни типу переменных V3 и V4.

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы: *
captcha
Обновить






Рейтинг@Mail.ru
Хостинг на серверах в Украине, США и Германии. © www.sector.biz.ua 2006-2015 design by Vadim Popov