- •§ 12. Строковые типы данных.
- •1. Множество значений строкового типа.
- •2. Описание типа – короткая строка.
- •3. Описание типа – длинная строка.
- •4. Обычные константы строкового типа.
- •5. Типизированные константы и переменные типа – короткая строка. Выделяемая память. Обращение к значениям составляющих. Реализация операции присваивания.
- •6. Типизированные константы и переменные типа – длинная строка. Выделение памяти и задание значений. Обращение к элементам строк.
- •7. Операции над данными строковых типов.
- •8. Некоторые стандартные процедуры и функции, используемые при обработке строк.
- •§ 13. Множественные типы данных.
- •1. Множественный тип. Его описание и множество значений. Простейшие выражения.
- •2. Переменные и константы множественного типа. Операции над данными множественного типа.
- •3. Процедуры include и exclude.
- •§ 14. Записи.
6. Типизированные константы и переменные типа – длинная строка. Выделение памяти и задание значений. Обращение к элементам строк.
Типизированные константы и переменные типа – длинная строка являются объектами, подобными динамическим массивам. При этом первый элемент строки имеет порядковый номер 1 (так же, как и для переменных и типизированных констант типа – короткая строка).
Обращение к значениям составляющих типизированных констант и переменных типа – длинная строка реализуется так же, как и обращение к значениям элементов одномерного массива.
С каждой типизированной константой и переменной типа – длинная строка в оперативной памяти связывается участок объёмом 4 байта, предназначенный для хранения адреса области памяти, в которой должно располагаться значение типизированной константы или переменной. Каждый элемент строки в данной области памяти занимает один байт.
Для типизированной константы типа – длинная строка начальное значение задаётся в описании этой константы. Начальным значением переменной типа – длинная строка по умолчанию является пустая строка. Память для пустой строки не выделяется.
Выделение памяти (или изменение её объёма), предназначенной для хранения значения типизированной константы или переменной типа – длинная строка, может быть реализовано с помощью процедуры SETLENGTH, а также с помощью оператора присваивания.
Заголовок процедуры SETLENGTH, в частности,может быть следующим
PROCEDURE SETLENGTH(VARS; L:INTEGER);
где S– это либо переменная-массив, либо обрабатываемая строка, аL– это соответственно либо количество элементов массива, либо устанавливаемая длина строкиS.
Рассмотрим ряд примеров.
Пример 1.
PROCEDURE … ;
VAR
S: STRING;
BEGIN
MEMO1. LINES. ADD (S[0]) // Ошибка на этапе компиляции
// (недопустимо обращение S[0],
// поскольку S– переменная
// типа – длинная строка).
END;
Пример 2.
PROCEDURE … ;
VAR
S: STRING;
BEGIN
MEMO1. LINES. ADD (S[1]) // Ошибка на этапе выполнения
// (не выделена память для значения S).
END;
Пример 3.
PROCEDURE … ;
VAR
S: STRING;
C: CHAR;
BEGIN
C := S[1] // Ошибка на этапе выполнения
// (не выделена память для значения S).
END;
Пример 4.
PROCEDURE … ;
VAR
S: STRING;
BEGIN
S[1] := ’A’ // Ошибка на этапе выполнения
// (не выделена память для значения S).
END;
Пример 5.
PROCEDURE … ;
VAR
S: STRING;
BEGIN
SETLENGTH (S, 0);
MEMO1. LINES. ADD (S[1]) // Ошибка на этапе выполнения
// (не выделена память для значения S).
END;
Пример 6.
PROCEDURE … ;
VAR
S: STRING;
BEGIN
S := ’’;
MEMO1. LINES. ADD (S[1]) // Ошибка на этапе выполнения
// (не выделена память для значения S).
END;
Пример 7.
PROCEDURE … ;
VAR
S: STRING;
BEGIN
// Момент I.
SETLENGTH (S,5);
// Момент II.
S[1] := ’A’;
S[2] := ’B’;
S[4] := ’C’;
MEMO1. LINES. ADD (S)
// Момент III.
END;
S
#0
#0
#0
#0
#0 S =
#0#0#0#0#0
II
S
’A’
’B’
#0
’C’
#0 S =
’AB’#0’C’#0
III AB MEMO1:
S
S =
’’
I
Пример 8.
PROCEDURE … ;
VAR
S: STRING;
BEGIN
// Момент I.
S := ’ABCDE’
// Момент II.
END;
S
S =
’’
I
S
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’
II
Пример 9.
PROCEDURE … ;
VAR
T, S: STRING;
BEGIN
T := ’ABCDE’;
// Момент I.
S := T
// Момент II.
END;
S
T =
’ABCDE’
I
T
’A’
’B’
’C’
’D’
’E’ S =
’’
S
T =
’ABCDE’
II
T
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’
Пример 10.
PROCEDURE … ;
VAR
L: BYTE;
S: STRING;
BEGIN
S := ’ABCDE’;
… // Задание значения переменной L.
// Момент I.
SETLENGTH (S,L)
// Момент II.
END;
S
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’
I
S
S =
’’
S
’A’
’B’
’C’ S =
’ABC’
S
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’
II
L=0
L=3
L=5
’ABCDE’#0#0
S
’A’
’B’
’C’
’D’
’E’ S =
L=7
#0
#0
Пример 11.
PROCEDURE … ;
VAR
T, S: STRING;
BEGIN
T := ’ABCDE’;
S := T;
// Момент I.
SETLENGTH (S,3)
// Момент II.
END;
S
T =
’ABCDE’
I
T
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’
S
T =
’ABCDE’
II
T
’A’
’B’
’C’
’D’
’E’ S =
’ABC’
’A’
’B’
’C’
Пример 12.
PROCEDURE … ;
VAR
T, S: STRING;
BEGIN
T := ’ABCDE’;
S := T;
// Момент I.
S := ’PQR’
// Момент II.
END;
S
T =
’ABCDE’
I
T
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’
S
T =
’ABCDE’
II
T
’A’
’B’
’C’
’D’
’E’ S =
’PQR’
’P’
’Q’
’R’
Пример 13.
PROCEDURE … ;
VAR
T, S, R: STRING;
BEGIN
T := ’ABCDE’;
S := T;
R := ’PQR’;
// Момент I.
S := R
// Момент II.
END;
S
T =
’ABCDE’
I
T
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’ R =
’PQR’
R
’P’
’Q’
’R’
S
T =
’ABCDE’
II
T
’A’
’B’
’C’
’D’
’E’ S =
’PQR’ R =
’PQR’
R
’P’
’Q’
’R’
Пример 14.
PROCEDURE … ;
VAR
T, S: STRING;
BEGIN
T := ’ABCDE’;
S := T;
// Момент I.
S[5] := ’F’
// Момент II.
END;
S
T =
’ABCDE’
I
T
’A’
’B’
’C’
’D’
’E’ S =
’ABCDE’
S
T =
’ABCDE’
II
T
’A’
’B’
’C’
’D’
’E’ S =
’ ABCDF’
’A’
’B’
’C’
’D’
’F’