11.2 Создание динамических переменных. Процедура NEW
Описание переменных P и Q ссылочного типа в разделе объявлений еще не резервирует память для записи значений динамической переменной соответствующего типа.
Здесь вводятся в употребление статические переменные P и Q (транслятор резервирует место в памяти, необходимое для размещения ссылки). Пустые клетки в схеме означают, что пока переменные P и Q не имеют никаких ссылок на динамические объекты.
Для порождения самого динамического объекта (создания динамических переменных) используется стандартная процедура NEW, которая называется процедурой динамического размещения.
Это процедура с параметром - ссылочной переменной, сопоставленной порождаемому динамическому объекту.
Итак, по процедуре NEW (R) выполняется резервирование участка в определенном месте памяти для последующего размещения значений динамической переменной и помещение адреса этого участка в ссылочную переменную R. При этом выделяется столько ячеек памяти, сколько требует значение динамической переменной, на которую указывает R. Количество отводимых ячеек зависит от типа динамической переменной. Динамические переменные, созданные посредством NEW, называют указанными переменными.
ЗАМЕЧАНИЕ. Резервирование места для динамической переменной идет уже в ходе выполнения программы, а не при ее трансляции, как для статических переменных. Говорят, что NEW устанавливает водораздел между статическими и динамическими переменными.
КАРТА ПАМЯТИ | ||||
MSX-DOS | ||||
Библиотека PASCAL | ||||
TURBO-система | ||||
Исходный текст программы | ||||
Объектный ход программы | ||||
Указатель ® | ----------------- | Куча |
ПРИМЕЧАНИЕ. Здесь указана примерная схема карты памяти при работе системы Турбо-Паскаль.
11.3 Переменные с указателями
При использовании в программе ссылочных переменных естественно возникает вопрос, как работать с динамическим объектом, т.е. как присваивать ему то или иное значение и распоряжаться им? Другими словами, как в программе на языке Паскаль ссылаться на динамический объект? Ведь мы знаем, что динамическим переменным, в отличие от статических, не дается имени в обычном понимании. Поэтому для работы с динамическим объектом в языке используется понятие "переменная с указателем".
Имя динамической переменной складывается из имени статической переменной типа указатель, поставленной в программе в соответствие данному динамическому объекту, и символа "^" после ссылочной переменной, свидетельствующего о том, что здесь речь идет не о ее значении, а о значении того программного объекта, на который эта ссылочная переменная указывает.
НАПРИМЕР:
Р - указатель: 5 ряд, 6 место,
Р^ - человек, сидящий в 5 ряду на 6 месте;
или
А - указатель,
А^ - имя динамической переменной, на которую указывает А.
Короче, А^ - переменная "старого" типа, которой можно присваивать конкретные значения.
Итак, пусть в программе содержатся:
VAR P: ^INTEGER; Q: ^CHAR;
NEW (P); NEW (Q).
Теперь в программе порождаются динамические переменные типов INTEGER и CHAR, которым с помощью оператора присваивания можно давать конкретные значения: Р^:= 58; Q^:= 'a'.
Переменная с указателями (она синтаксически играет роль динамической переменной) используется в любых конструкциях языка как обычная переменная, в зависимости от ее типа. Так, если R есть тоже переменная типа INTEGER, то синтаксически правильно написание следующих операторов присваивания:
R:= R + P^ + 2; P^:= P^ div 3.
В качестве ссылочной переменной может использоваться и более сложная конструкция, являющаяся частичной переменной, имеющей соответствующий ссылочный тип. Так, если в программе есть описания ссылочного типа TYPE REFREAL = ^REAL и переменной этого типа VAR A: ARRAY[1..50] OF REFREAL (в силу которого значением переменной А может быть массив элементов ссылочного типа, причем каждая из ссылок указывает на вещественное значение), то в качестве ссылочной переменной может фигурировать переменная с индексом, например, А[2]^ или А[K+5]^. Значением этих переменных с указателями будут вещественные числа. Иначе, определив
TYPE P = ARRAY[1..50] OF INTEGER; VAR B: ^P,
переменная В будет указателем на массив типа Р и в этом случае элементы массива обозначаются так - В^[2], B^[K+5].
ПРИМЕР 1. Поиск буквы во множестве букв и печать общих букв двух множеств
programm SETUK;
type MN = set of char;
var A,B: ^MN; C: MN; I,D: char;
begin
¦ new(A); A^:= ['a','c','o'];
¦ write('введите букву, которую надо найти:'); rеаdln(d);
¦ if D in A^ then writeln('да')
¦ else writeln('нет');
¦ new(B); B^:= ['g','c','o']; C:= A^ * B^;
¦ writeln('общие буквы множеств:');
¦ for I:= 'a' to 'z' do
¦ if I in C then write (I,' ')
end.
ПОЯСНЕНИЕ. В этой программе используются два динамических множества А и В, а также статическое множество С. Место, занимаемое в памяти под запись множеств A и B может быть освобождено после получения множества C.
ВЫВОДЫ (отличия динамической переменной от статической):
Вместо описания самих динамических переменных в программе дается описание указателей, поставленных в соответствие с ними.
В определенном месте программы должно быть предусмотрено порождение каждой из динамических переменных с помощью процедуры NEW.
Для идентификации значения динамической переменной используется переменная с указателем.
... .....-46.780 Program Prim24; Var r1,r2:real; BEGIN r1:=-46.78; r2:=-46.78; writeln('r1=',r1:12:3,' r2=',r2:9:4); writeln('_______________________________'); readln; END. 6. Массивы 6. 1. Описание массивов В языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей (структурированных) данных является массив. ...
... . Объясните, для чего служат разрешения и привилегии в Windows NT. Зав. кафедрой -------------------------------------------------- Экзаменационный билет по предмету СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Билет № 22 Перечислите возможности и инструменты системы программирования Microsoft Developer Studio. Укажите для чего предназначается буфер в системах ввода-вывода, ...
... с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид: ...
0 комментариев