Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
(2011. 10. 22) КН (с. 126 - ).doc
Скачиваний:
15
Добавлен:
19.05.2015
Размер:
228.86 Кб
Скачать

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’