Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Паскалю.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
2.06 Mб
Скачать

4.3. Указатели

Указатели содержат адрес ячейки в памяти компьютера, которая в свою очередь содержит некоторую информацию.

4.4. Строки

Тип STRING (строка) в Турбо Паскале используется для обработки текстов. Он во многом похож на одномерный массив символов ARRAY[O..N] OF CHAR, однако, в отличие от последнего, количество символов в строке-переменной может меняться от 0 до N, где N – максимальное количество символов в строке. Значение N определяется объявлением типа STRING [N] и может быть любой константой порядкового типа, но не больше 255. Турбо Паскаль разрешает не указывать N, в этом случае длина строки принимается максимально возможной, а именно N=255.

Строка в Турбо Паскале трактуется как цепочка символов. К любому символу в строке можно обратиться точно так же, как к элементу одномерного массива ARRAY [0..N] OF CHAR, например:

var

st : String;

begin

.....

if st[5] = 'A' then...

end.

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

var

st : String;

i : Byte;

begin

i := ord(st [0] ) ; {i - текущая длина строки}

while (i <> 0) and (st[i] = ' ') do

begin

dec(i);

st[0] := chr(i) 

end;

.....

end.

Значение ORD(st[0]), т.е. текущую длину строки, можно получить и с помощью функции LENGTH(st), например:

while (Length(st)<>0) and (st[Length(st)]=' ') do 

st[0] := chr(Length(st)-1)

К строкам можно применять операцию «+» – сцепление, например:

st := 'а1 + 'b'; 

st := st + 'с'; {st содержит "abc"}

Если длина сцепленной строки превысит максимально допустимую длину N, то «лишние» символы отбрасываются.

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

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

Два типа считаются совместимыми, если:

  • оба они есть один и тот же тип;

  • оба вещественные;

  • оба целые;

  • один тип есть тип-диапазон второго типа;

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

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

  • оба являются упакованными строками (определены с предшествующим словом PACKED) одинаковой максимальной длины;

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

  • один тип есть любой указатель, а другой – нетипизированный указатель;

  • один тип есть указатель на объект, а другой – указатель на родственный ему объект;

  • оба есть процедурные типы с одинаковыми типом результата (для типа-функции), количеством параметров и типом взаимно соответствующих параметров.

Совместимость типов приобретает особое значение в операторах присваивания. Пусть T1 – тип переменной, а Т2 – тип выражения, т.е. выполняется присваивание T1 := T2. Это присваивание возможно в следующих случаях:

  • T1 и T2 есть один и тот же тип и этот тип не относится к файлам или массивам файлов, или записям, содержащим поля-файлы, или массивам таких записей;

  • T1 и T2 являются совместимыми порядковыми типами и значение T2 лежит в диапазоне возможных значений T1;

  • T1 и T2 являются вещественными типами и значение T2 лежит в диапазоне возможных значений T1;

  • T1 - вещественный тип и T2 - целый тип; ,

  • T1 - строка и T2 – символ;

  • T1 - строка и T2 – упакованная строка;

  • T1 и T2 – совместимые упакованные строки;

  • T1 и T2 – совместимые множества и все члены T2 принадлежат множеству возможных значений T1;

  • T1 и T2 – совместимые указатели;

  • T1 и T2 – совместимые процедурные типы;

  • T1 – объект и T2 – его потомок.

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

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

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

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

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

Совмещение данных в памяти может произойти при использовании записей с вариантными полями, типизированных указателей, содержащих одинаковый адрес, а также при явном размещении данных разного типа по одному и тому же абсолютному адресу. Для размещения переменной по нужному абсолютному адресу она описывается с последующей стандартной директивой ABSOLUTE, за которой помещается либо абсолютный адрес, либо идентификатор ранее определенной переменной. Абсолютный адрес указывается парой чисел типа WORD, разделенных двоеточием; первое число трактуется как сегмент, второе – как смещение адреса. Например:

b : Byte absolute $0000:$0055; w : Longlnt absolute 128:0;

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

var

х : Real;

у : array [1..3] of Integer absolute x;

В этом примере переменные X и Y будут размещены, начиная с одного и того же абсолютного адреса. Таким образом, одну и ту же область памяти длиной 6 байт, а следовательно, и размещенные в этой области данные теперь можно рассматривать как данные либо типа REAL, либо как массив из трех данных типа INTEGER.

Неявные преобразования типов могут служить источником трудно обнаруживаемых ошибок в программе, поэтому везде, где это возможно, следует избегать их [8,9].