PROCEDURE …;
VAR
S: STRING[10];
BEGIN
S:= ’ABCDEF’; // S = ’ABCDEF’
S:= ’0123456789ABCD’ // S = ’0123456789’
END;
Типизированные константы и переменные типа – длинная строка. Выделение памяти и задание значений. Обращение к элементам строк.
Типизированные константы и переменные типа – длинная строка являются объектами, подобными динамическим массивам. При этом первый элемент строки имеет порядковый номер 1 (так же, как и для переменных и типизированных констант типа – короткая строка).
Обращение к значениям составляющих типизированных констант и переменных типа – длинная строка реализуется так же, как и обращение к значениям элементов одномерного массива.
С каждой типизированной константой и переменной типа – длинная строка в оперативной памяти связывается участок объёмом 4 байта, предназначенный для хранения адреса области памяти, в которой должно располагаться значение типизированной константы или переменной. Каждый элемент строки в данной области памяти занимает один байт.
Для типизированной константы типа – длинная строка начальное значение задаётся в описании этой константы. Начальным значением переменной типа – длинная строка по умолчанию является пустая строка. Память для пустой строки не выделяется.
|
|
Выделение памяти (или изменение её объёма), предназначенной для хранения значения типизированной константы или переменной типа – длинная строка, может быть реализовано с помощью процедуры SETLENGTH, а также с помощью оператора присваивания.
Заголовок процедуры SETLENGTH, в частности, может быть следующим
PROCEDURE SETLENGTH (VAR S; 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;