9794

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

Реферат

Информатика, кибернетика и программирование

Описание типов В простейшем случае тип переменной указывается при ее описании явно. Однако Pascal допускает отдельное определение типа. Иными словами, можно сопоставить типу некоторое имя и в дальнейшем вместо явного указания типа использовать введе...

Русский

2013-03-17

117 KB

8 чел.

Описание типов

В простейшем случае тип переменной указывается при ее описании явно. Однако Pascal допускает отдельное определение типа. Иными словами, можно сопоставить типу некоторое имя и в дальнейшем вместо явного указания типа использовать введенный для этого типа идентификатор.

Типы, аналогично переменным, определяются посредством описаний, которые начинаются со служебного слова type и содержат последовательность определений типов. Каждое определение состоит из пары: имя типа и собственно тип. Имя типа обозначается идентификатором; сам тип описывается согласно определенным для его правилам. Разделителем в данном случае выступает символ '=' (равно), что имеет некоторое сходство с определением константы (идентификатор типа, так же, как и идентификатор константы, можно рассматривать как обозначение некоторого неизменяемого объекта). Каждая пара завершается символом ';' (точка с запятой).

Примеры определений типов:

type

Days  =   (Monday,Tuesday,Wednesday, Thursday,Friday,Saturday,Sunday);

WorkingDays  = Monday..Friday;

Diapason =  1..20;

Letters =   'a'..'z';

Positive_Integer = word;

(Заметим, что определение типа Positive_Integer, no существу, вводит синоним для стандартного скалярного типа word).

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

var

Birthday,   Current_Day   :  Days;

Index   :   Diapason;

First_Letter   :   Letters;

LoopCount   :  Positive_Integer;

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

Ниже представлены синтаксические диаграммы для введенных понятий.

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

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

Дополнительно к обычным константам Turbo Pascal допускает использование качественно новых объектов - типизированных констант. Такие константы занимают промежуточное положение между обычными константами и переменными, что отражается в следующих их характеристиках:

1. Типизированные константы описываются в разделе описаний констант вместе с обычными константами.

2. Так же, как обычные константы, типизированные константы получают при описании (начальное) значение.

3. Аналогично переменным, типизированные константы имеют тип, который задается при их описании, а также могут получать НОВЫЕ значения (например, посредством оператора присваивания). Таким образом, название "константа" в данном случае является достаточно условным. Типизированные константы можно использовать точно так же, как и обычные переменные таких же типов. Кроме того, для типизированных констант составных типов введены удобные способы задания начальных значений.

Синтаксические диаграммы для типизированных констант приведены ниже.

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

const

  Мах   :   integer = 9999;

  Min = 0; {Обычные и типизированные константы могут описываться вместе}

  MySet : set of char = ['a'..'z'];

  MyArray  :  array[1..3]  of Color -  (Red,Yellow,Yellow);

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

1. Константы простых, строковых, ссылочных и процедурных переменных. Описание типизированных констант с простым типом достаточно очевидно, например:

const

Pi : real = 3.14;

StopChar : char = #13;

Diap : 0..100 = 1;

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

const

Мах = 100;

type

Diapason = 0..Max;

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

const

Min   :   integer = 0;

Max   :   integer = 99;

var

M  :   array[Min .. Max]   of byte;

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

Описания типизированных констант строкового типа (см. главу 7) также достаточно очевидны:

const

Title   :   string =  'Заголовок';

EndOfLine   :   string[2]  = #13#10;

Answer  :   string[3]  =  'No’;

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

var

X   :   real;

const

PtrX   :   ^real = @X;

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

type

MyCodeT = procedure ( Code:integer );

procedure MyCode ( Code:integer ); far;

begin

WriteLn (‘Код =   ',Code)

end;

const

CodeOutput   :  MyCodeT = MyCode;

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

1) type

       Status = (Active,Passive,Waiting);

       TaskStatus = array[Status]  of string[7];

const

        StrStatus   :   TaslcStatus =   ('Active1,   'Passive', 'Waiting');

2)   const

        Vote   :   array[1..3]   of string[7]  = ('Да',   'Нет',   'Не знаю');

        Row  :  array[1..10]  of byte = (1,2,3,4,5,6,7,8,9);

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

type

Cube = array[l..2,1..2,1..2] of byte;

const

MyCube : Cube = ( ( (1, 2) , (3,4) ), ( (5,6) , (7, 8) ) ) ;

задает следующие начальные значения элементов массива MyCube:

MyCube[1,1,1] = 1 MyCube[l,l,2] = 2

MyCube[1,2,1] = 3 MyCube[1,2,2] = 4

MyCube[2,1,1] = 5 MyCube[2,1,2] = 6

MyCube[2,2,1] = 7 MyCube[2,2,2] = 8

Синтаксическая диаграмма для изображения массива приводится ниже.

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

4. Константы типа множество. Типизированные константы множественных типов инициализируются изображениями множеств (см. главу 8), с той лишь разницей, что в данном случае это изображение должно строиться только из констант, в отличие от обычного изображения множества, допускающего выражения с переменными. Примеры:

1) type

Digits - set of 0..9;

    const

 MyDigits : Digits = [0,2,4,6,8];

2) const

Indexes  :   set of byte = [1..10,20,88,100..200];

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

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

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

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

В языке имеется три основных способа задания преобразований типов.

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

Этот способ является исключением и допускается только в присваивании (см. разд. 9.1), когда, например, вещественной переменной назначается целое значение (целое в этом случае "обобщается" до вещественного). Возможные случаи неявного преобразования определяются понятием совместимости по присваиванию и приводятся далее в разд. 4.5.

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

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

chr(S)

Далее перечислены некоторые стандартные функции преобразования:

Имя функции

Тип аргумента

Преобразование и тип результата

Odd

целый

Выдает true, если аргумент нечетный, и false, если аргумент четный

Trunc

вещественный

Выдает целую часть аргумента (дробная часть отбрасывается)

Round

вещественный

Выдает аргумент, округленный до ближайшего целого

Ord

дискретный

Результат - целый порядковый номер (нумерация от 0) значения аргумента в данном дискретном типе

Chr

0. .255

Выдает символьное значение (символ) с заданным в аргументе порядковым номером

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

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

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

 ТИП (ПЕРЕМЕННАЯ)

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

var

SI   :   0. .255;

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

SI    :=   'А'

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

char(SI)   :=  'А'

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

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

type

Days = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

var

aDay   :   Days ;

Num  :  byte;

Тогда допустимы такие операторы:

Days(Num) := Monday; {  Num = 0  }

aDay   := Days(Num); {  aDay = MonDay  }

Num   := byte(Friday); {  Num = 4   }

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

Num   := Ord(Friday);

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

aDay  := Days(Num+1);

Num   := byte(Pred(Friday));

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

var

LI   :   longint ;

I : integer;

begin

LI := 1234567;

I := integer (LI+1) ;

Writeln(I)

end.

приведет к выводу на экран значения -10616 (значение типа longint в процессе приведения к типу integer будет "обрезано").

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

Синтаксические диаграммы для приведений показаны ниже.

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

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

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

1) Т1 и Т2 представляют собой ОДИН И ТОТ ЖЕ идентификатор типа;

2) Тип Т2 описан с использованием типа Т1 с помощью непосредственного равенства вида

type

Т2 = Т1;

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

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

type

T1 = integer;

Т2 = Т1;

Т3 = Т2;

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

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

type

A1 = array[1..10]   of integer;

A2 = array[1..10]   of integer;

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

var

VI,   V2   :   array[1..10]   of integer;

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

var

VI   :   array[1..10]   of integer;

V2   :   array[1..10]   of integer;

V3,   V4    :   A1;

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

В числом виде эквивалентность типов требуется только в случае передачи параметров при вызове процедур или функций (то есть типы фактических и формальных параметров должны быть эквивалентны). В других Pascal-конструкциях используются несколько ослабленные (но более детальные) ограничения, называемые СОВМЕСТИМОСТЬЮ типов.

Совместимость типов

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

  •  два типа эквивалентны;
  •  оба типа являются либо целыми, либо оба типа являются вещественными;
  •  один тип является ограниченными типом, причем его базовым типом является другой тип:
    type
     
    T1 = shortint;
     
    T2 = 1..100;
  •  оба типа являются ограниченными, причем их базовым типом является один и тот же тип:
    type
     
    T1 = 10..100;
     Т2 = 1..5;
  •  оба типа являются множественными типами (см. главу 8), причем их базовые типы являются совместимыми:
    type
     
    T1 = set  of byte;
     
    T2 = set of 1..10;
  •  оба типа являются упакованными символьными массивами (см. разд. 5.3) с одинаковым числом элементов;
  •  один тип является строковым (см. главу 7), а другой тип либо также является строковым типом, либо упакованным символьным массивом, либо символьным типом;
  •  один тип является ссылочным типом, а другой тип либо также является ссылочным типом, либо является бестиповым указателем (см. разд. 11.9);
  •  оба типа являются процедурными типами (см. разд. 10.12) с одинаковым числом параметров, типы которых эквивалентны (соответствие по порядку), и (для функциональных типов) с эквивалентными типами результата.

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

Два типа являются совместимыми по присваиванию, если выполняется хотя бы одно из следующих условий:

  •  оба типа эквивалентны и ни один из них не является файловым типом (см. главу 13) или структурным типом, содержащим поле с файловым типом на одном из своих уровней;
  •  оба типа являются совместимыми дискретными типами, и значения типа правой части попадают в диапазон возможных значений типа левой части;
  •  оба типа являются вещественными типами, и значения типа правой части попадают в диапазон возможных значений типа левой части;
  •  тип левой части является вещественным типом, а тип правой части является целым типом;
  •  тип левой части является строковым типом, а тип правой части - либо строковым типом, либо символьным типом, либо упакованным символьным массивом;
  •  оба типа являются совместимыми упакованными символьными массивами;
  •  оба типа являются совместимыми множественными типами, причем множество из правой части целиком входит в множество из левой части;
  •  оба типа являются совместимыми ссылочными типами, либо совместимыми процедурными типами;
  •  тип левой части является процедурными типом, а правая часть представляет собой идентификатор процедуры или функции, причем с таким же числом параметров, что у типа левой части; типы параметров должны быть эквивалентны, так же, как и (для случая функции) эквивалентны типы результата;
  •  оба типа являются объектовыми типами, причем тип правой части является потомком типа левой части (подробнее см. разд. 16.3), либо оба типа являются ссылочными типами на совместимые объектовые типы. Если в операторе присваивания не выполняется ни одно из этих условий, то на этапе компиляции или выполнения выдается сообщение об ошибке.

Обзор составных типов. Регулярные типы (массивы)

Введение

Простые типы, описанные в главе 2, определяют различные множества атомарных (неразделимых) значений. Составные, или структурные типы, в отличие от простых, задают множества "сложных" значений; каждое значение из такого множества образует некоторый агрегат (совокупность) нескольких значений другого типа (или других типов). Можно сказать, что составные типы определяют некоторый способ образования новых типов из уже имеющихся, причем отдельные элементы составных значений могут иметь любой, в том числе составной, тип. Таким образом, Pascal допускает образование структур данных произвольной сложности, позволяя тем самым достичь адекватного представления в программе тех данных, с которыми она оперирует.

В языке Pascal определены следующие составные типы (см. схему в разд. 2.1):

• регулярные типы (массивы);

• комбинированные типы (записи);

• множественные типы;

• строковые типы;

• файловые типы;

• объектные типы.

В последующих разделах подробно описываются регулярные, комбинированные и множественные типы. Строковые типы представлены в главе 7. Описание файловых типов вынесено в главу 12, объектовых типов - в главу 15. Данная глава посвящена наиболее употребительным регулярным типам.

Регулярные типы

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

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

type

А = array   [  T1 ]    of Т2;

где array и of - служебные слова, Т1 обозначает тип индекса массива, Т2 - тип компонент массива. В дальнейшем идентификатор этого типа может быть использован в описании переменных.

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

Ниже приведены несколько примеров описания массивов:

type

M1  = array[1..100]   of real;

M2 = array[char]   of boolean;

Matrix = array[1..10]  of array[1..20]  of integer;

DataBase = array [1. .MaxF]   of file of Person;

var

Vector   :   Ml;

Sym_Table   :   M2;

Arrl,   Arr2   :   Matrix;

S   :   array [ (Red, Yellow, Green) ]   of boolean;

Следует подчеркнуть некоторые различия между регулярными типами в языке Pascal и массивами в некоторых других языках программирования. Во-первых, в Pascal'e количество элементов массива всегда должно быть фиксировано, то есть определяться при трансляции программы. Это считается определенным недостатком языка, так как не во всех программах можно заранее предсказать необходимый размер массива (который может определяться в зависимости от тех или иных условий, возникающих в процессе исполнения).

Далее, для задания количества элементов массива используется тип; число элементов определяется количеством возможных значений указанного типа, что отличает Pascal от многих других языков, в которых размер массива задается либо целым числом (или выражением целого типа), либо диапазоном целых чисел. Такая особенность языка Pascal придает ему дополнительную гибкость, позволяя "нумеровать" элементы массива не только целыми числами, но и значениями произвольного дискретного типа. Например, массив Sym_Table из предыдущего примера может адекватно моделировать некоторую логическую шкалу, в которой каждому символу (с типом char) соответствует некоторое логическое значение, а доступ к элементам этого массива может быть организован следующим образом:

Sym_Table ['а' ] := true ;

if Sym_Table[','] then   ...

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

var

V2   :   array[1..10]   of array[1..20]   of byte;

Такую переменную можно трактовать двояко: как массив, состоящий из нескольких массивов, либо как один ДВУМЕРНЫЙ массив (матрица). Для сокращения записи в подобных случаях можно использовать ЭКВИВАЛЕНТНУЮ форму определения регулярных типов, где в квадратных скобках указывается список типов индексов, разделенных запятыми, например:

var

V2   :   array[1..10,1..20]   of byte;

Число индексов в определении (то есть размерность массива) в языке не ограничивается.

При работе с массивами необходимо помнить об ограничении на размер общей памяти под переменные (см. разд. 3.1); чаще всего предел в 64К бывает превышен из-за ошибочного описания массивов (либо состоящих из чрезмерного числа элементов, либо больших размеров этих элементов).

Синтаксическая диаграмма для регулярных типов приводится ниже.

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

type

MyVec = packed array[1..20]   of Elem;

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

Pascal допускает единственное возможное действие над массивом в целом: использование его в операторе присваивания, например:

Vectl   := Vect2

причем типы обоих массивов в данном случае должны быть эквивалентны (см. разд. 4.4).

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

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

Vector[1]

Vector[(i+1)*2]

Двумерный массив V2, описанный выше, допускает такой доступ к своим элементам:

V2[3,7]

V2[i,j]

Рассмотрим подробнее массив V2. Так как его можно трактовать как "массив массивов", то, например, конструкция

V2[k]

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

V2[k][5]

Такая запись корректна; ее более привычный эквивалент -

V2[k,5]

– считается сокращением первоначальной записи.

Элемент массива считается переменной; он может получать значения (например, в операторе присваивания), а также участвовать в выражениях, где он представляет значение, помещенное в соответствующий элемент данного массива. Ассортимент операций над элементами массива полностью определяется типом этих элементов (базовым типом массива).

Примеры:

V2[i,j] := V2[i,j-l]+l

Sym_Table['z'] := Switch and Sym_Table['a']

Символьные массивы

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

var

S   :   array[1.. 13]   of char;

Pascal содержит некоторые дополнительные средства для работы с такими массивами. Во-первых, имеется возможность записывать конкретные значения строковых массивов с помощью изображение строки и использовать их в присваиваниях и передаче параметров:

S := 'Пример строки'

Изображение строки строится из цепочки символов, составляющих строковый массив, и заключается в одинарные кавычки (апострофы). Если необходимо задать апостроф внутри самой строки, то он удваивается. Допускается формирование строк с использованием десятичных кодов символов и специальных обозначений (см. разд. 2.4). В этом случае строка составляется в виде слитной последовательности различных способов представлений символов, чередующихся в произвольном порядке, например:

#7’Текст сообщения’^A#176#176^B

Кроме того, для строковых массивов допускается операция конкатенации, обозначаемая символом ‘+’ (плюс), смысл которой заключается в формировании нового символьного массива, число элементов которого равно сумме размеров массивов-операндов, а значениями элементов - элементы массивов-операндов, расположенные последовательно друг за другом. Так, если в программе имеются описания:

var

S1   :   array[1..9]   of char;

S2   :   array [1.. 6]   of char;

то допустимы следующие операторы:

S1 := 'СТРОКОВЫЙ1’;

S2 := 'массив';

WriteLn(S1 + ' ' + S2);

В результате выполнения последнего оператора на экран дисплея будет выведено сообщение:

Строковый массив

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

S    :=   S1   +    '    '    +   S2;

вызовет ошибку компиляции независимо от размера символьного массива S. В подобных случаях необходимо использовать строки переменной длины., описываемые в главе 7.

Ошибки в работе с регулярными типами

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

var

Vector   :   array[0..10]   of real,

обращение вида

Vector[11]    := 0.5

является некорректным, так как индекс 11 не принадлежит ограниченному типу 0 . . 10, и вызовет прекращение трансляции с выдачей соответствующего диагностического сообщения.

Однако, оператор присваивания

Vector[i] := Vector[i-1]+i

компилятор не может квалифицировать как ошибочный, так как его корректность зависит от текущих значений индексов i и i-1. Если в процессе выполнения программы значение i лежит в диапазоне от 1 до 10, то этот оператор выполнится правильно; в противном случае будет зафиксирована ошибка времени выполнения.

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

Turbo Pascal позволяет частично управлять характером формирования объектного кода, относящегося к доступу к элементам массивов, посредством директивы компилятора $R. Так, если в тексте программы указана директива

{$R+}

то компилятор будет порождать код, делающий такие проверки. Этот режим принят по умолчанию. Директива

{$R-}

приводит к "облегченному" объектному коду, не содержащему проверок. В последнем случае выход индекса за пределы допустимого диапазона НЕ ПРИВЕДЕТ к прекращению работы программы; обращение к "несуществующему" элементу массива даст неопределенный результат, что может сделать ход дальнейшего выполнения программы непредсказуемым.

<…>


 

А также другие работы, которые могут Вас заинтересовать

31908. ЛЕКСИЧЕСКАЯ СЕМАНТИКА 3.24 MB
  Ее ключевыми элементами являются: 1 Принцип интегральности описания языка в силу которого лексемам в явном виде приписываются все свойства релевантные для правил а правила учитывают все формы поведения лексем не упомянутые непосредственно в словаре.
31909. Внутрішнє представлення цілочисельних даних в IBM РС 58.65 KB
  Виконати переклад заданих викладачем чисел з десяткової в двійкову систему числення. Дати їх внутрішнє (машинне) представлення в залежності від діапазону в знакових і беззнакових форматах типів Shortint (signed char), Byte (unsigned char), Integer (int), Word (unsigned int). Машинне представлення даних має бути дане в двійковій і шестнадцятирічній системах числення.
31910. Свобода совісті – явище духовної культури 103.5 KB
  Неоднозначність впливу релігії на різні сфери суспільного життя. Релігія в житті українців. Релігія і вільнодумство і атеїзм. Історичне підгруддя і реалії сьогодення. Свобода совісті як форми запобігання і вирішення соціальних конфліктів на релігійному ґрунті.
31913. ЗАХИСТ ІНФОРМАЦІЇ. КОНСПЕКТ ЛЕКЦІЙ 1.82 MB
  У звязку з цим різко зріс інтерес широкого кола користувачів до проблем захисту інформації. Захист інформації це сукупність організаційнотехнічних заходів і правових норм для попередження заподіяння збитку інтересам власника інформації. Тривалий час методи захисту інформації розроблялися тільки державними органами а їхнє впровадження розглядалося як виключне право тієї або іншої держави.
31915. УЧЕТА И АУДИТ ДЕНЕЖНЫХ СРЕДСТВА НА ПРЕДПРИЯТИИ ООО «ЭТАЛОН -СПБ» 696.5 KB
  Денежные средства выполняют следующие основные задачи: проверка правильности документального оформления и законности операций с денежными средствами, расчетных и кредитных операций, своевременное и полное отражение их в учете; обеспечение своевременности, полноты и правильности расчетов по всем видам платежей и поступлений