Размещение указателей

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

declare STACK POINTER;

call STACK_INITIALIZATION(STACK);

В этом случае процедура STACK_INITIALIZATION должна быть вызвана явным образом для того, чтобы разместить стек в памяти (рис. 4.13).

Процедура STACK_INITIALIZATION должна иметь следующую структуру:

STACK_INITIALIZATION: procedure(X);

declare X POINTER;

declare 1 STACK BASED(X),

/* X – указывает на стек */

2 ENTRIES(100) FIXED,

2 TOPOFSTACK FIXED;

ALLOCATE STACK SET(X);

TOPOFSTACK = 0;

end;

Рис. 4.13 — Размещение указателей

Только в этой процедуре известна структура данных, на которые ссылается указатель STACK, поэтому довольно сложно изменить эту структуру за пределами процедуры.

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

STACK: procedure;

declare X POINTER;

declare 1 STACK BASED(X);

2 ENTRIES(100) FIXED,

2 TOPOFSTACK FIXED;

/* разместить стек */

STACK_INITIALIZATION: ENTRY(X);

...

/* поместить элемент в стек */

PUSH: procedure(X, элемент);

...

return;

/* извлечь элемент из стека */

POP: procedure(X, элемент);

...

return;

...

end;

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