Учебная работа. Реферат: Ссылочный тип данных. Динамические объекты.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (5 оценок, среднее: 4,80 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Реферат: Ссылочный тип данных. Динамические объекты.

1. Природа динамических объектов и методы их реализации.

Все объекты, представляющие данные в программке и которые разглядывали до сего времени, были статические в том смысле, что все их характеристики, размеры были известны до выполнения программки. Как следует, ресурсы для их можно было заблаговременно спланировать и выделить.

Есть задачки, для которых типично наличие данных: — фактическое возникновение которых может быть, но не непременно; — время жизни этих объектов меньше времени выполнения программки. Такие объекты именуют динамическими объектами.

к примеру, если нам нужно избрать из входного потока данных, совокупы данных, владеющих определенными качествами. Встретим либо нет мы такие совокупы это вопросец. Потому выделение ресурсов для их хранения заблаговременно навряд ли уместно. Наиболее того мы не знаем как велика будет таковая совокупа. Потом, если собранную совокупа мы должны передать по линиям связи, к примеру, на другую машинку, то в нашей программке разумно было бы ресурсы, занимаемые переданной совокупой, высвободить для остальных нужд. (Ресурсов не хватает постоянно — это закон)

Для работы со статическими объектами в языках программирования употребляется отлично узнаваемый механизм имен. Pascal тут не исключение. Но, этот механизм навряд ли нам подступает для представления и манипуляции динамическими объектами. Дело в том, что имя обязано быт понятно до выполнения программки — это во-1-х. Во вторых, порождение всякого именованного объекта соединено с выделением памяти. Раз объекты появляются динамически, то заблаговременно мы не знаем сколько их будет. Как следует не можем заблаговременно выделить (породить, написать, придумать) необходимое количество имен. Дальше, не ясно чему соответствует в памяти имя не имеющегося объекта. Когда объект стал не нужен мы не можем убить имя. Нет таковых средств в языке. С иной стороны, уже при написании программки нам нужно как-то обрисовывать деяния над динамическими объектами.

Для решения данной задачи в программировании был предложен механизм ссылок. Мысль его заключается в том, что динамические объекты представлены не очевидно, а через некую статическую переменную, которая показывает на пространство расположения динамического объекта, если он существует, или содержит особое означает что ее имя» динамического объекта. Это особое имя, называемое ссылкой (саму переменную, при всем этом, нередко именуют указателем) и которое показывает где располагается, как отыскать объект и получить доступ к значению.

В случае Pascal таковыми именованием является адресок в памяти где располагается динамический объект. Всякий раз, когда порождается динамический объект ему выделяется пространство в памяти. Адресок начала выделенной области памяти полагается в качестве значения ссылочной переменной, представляющей динамический объект. При ликвидировании динамического объекта занимаемая им память считается вольной, а соответственная ссылочная переменная воспринимает особое один динамический объект.

К недочетам такового решения можно отнести последующее. Если объект) будет утеряно — этот объект будет невозвратно утерян. Ведь его «имени» мы очевидно не знаем. Оно есть один и этот же объект и этот объект будет уничтожен при помощи одной из их, то все манипуляции с иными ссылочными переменными станут неправильными.

2. Описание ссылочных переменных и их семантика

Синтаксис задания ссылочного типа:

<задание ссылочного типа>::= ^<имя типа>

^ — признак ссылочного типа; <имя типа> — имя обычного или описанного ранее типа. Это тип динамических объектов, которые может представлять переменная ссылочного типа. нужно выделить , что тут быть может лишь имя типа.

Сами переменные ссылочного типа вводятся обыденным образом.

type
массив = array [1..100] of integer;
массивссылок= array [1..100]of ^integer;
var
q,p:^integer;
c:^char;
матрица:^массив;
волшебство:массивссылок;

Связь указателя (ссылочной переменной) с объектом графически можно проиллюстрировать так:

слово).

Следует уяснить, что описание вида

var v:^T;

только вводит статическую переменную (под которую отводится память). Но, никакого объекта типа Т при всем этом не возникает. Для порождения объекта служит обычная процедура new. Эта процедура имеет один фактический параметр — ссылочную переменную. В итоге выполнения оператора процедуры new порождается динамический объект соответствующего типа, а ссылочной переменной-параметру присваивается ссылка на этот лишь что порожденный объект.

При всем этом сделанному динамическому объекту никакого значения не присваивается. Потому система new(v) равносильна описанию статической переменной типа Т.

Для работы с динамическими объектами употребляется переменная с указателем:

<переменная с указателем>::=<ссылочная переменная>^

тут ссылочная переменная — это та ссылочная переменная, которая представляет в программке соответственный динамический объект. Стрелка опосля имени ссылочной переменной свидетельствует о том, что речь идет о значении динамического объекта, который эта переменная представляет, а не о самой переменной.

к примеру:

r^:=35; p^:=r^+p^div3; матрица^[p^+3]:=25; волшебство[p^+3]^:=3

В примере матрица^[p^+3]:=25; происходит разименование ссылочной переменной матрица (выражение вида матрица^ нередко именуют разименованием, а операцию ^ — операцией разименования; эта операция есть в почти всех языках программирования). В случае волшебство[p^+3]^:=3 происходит разименования не полной ссылочной переменной волшебство, а только частичной переменной волшебство[p^+3]. Операция разименование применима лишь к обычным переменным ссылочного типа.

3. Деяния над ссылками

Над значениями ссылочного типа нет операций, которые бы давали значения ссылочного типа. Над значениями ссылочного типа определены лишь операции присваивания и сопоставления на равенство и не равенство. В операторе присваивания вида p:=e ссылочным выражением быть может: — пустая ссылка nil; -ссылочная переменная; -ссылочная функция (т.е. функция чье 1-го и такого же типа.

Пусть var p, g :^integer. к примеру, p:=q; приводит к тому что и p и q указывают на один и этот же объект, но если при всем этом объект, на который указывала ссылочная переменная p, будет утерян, то деяния с q станут неправильными!

Некорректно было бы написать p:=q^ т.к. слева переменная ссылочного типа, а справа

Отличия использования динамических переменных:

динамические переменный представлены через статические переменные ссылочного типа;

динамическая переменная обязана порождаться очевидно при помощи процедуры new;

для доступа к значениям динамической переменной употребляется переменная с указателем.

4. Пример.

Разглядим последующую задачку. Есть наружный файл, представляющий учреждение, состоящий из записей о служащих учреждения. О любом служащем понятно ФИО, пол, год рождения, должность (лаборант, техник, инженер, научный сотрудник, админ, начотдела, замдиректора, директор), специальность (математик, программер, механик, электроник, экономист, юрист, физик, химик), номер отдела (1 .. 32), где работает служащий, черта. Требуется найти отдел, где работает больше всего научных служащих. В отделе не наиболее 50 служащих.

структура программки быть может описана так:

program выбор (учреждение, output);
begin
for i:= 1 to 32 do
begin{избрать из файла всех служащих из 1-го отдела}
{если число нс в текущем отделе больше, чем в
результирующем, то взять в качестве новейшего значения
результирующего массива значение текущего}
end
{вывод номера отдела}
end

Разумеется, что эффективность данной программки будет существенно зависеть от того как мы реализуем «взять в качестве новейшего значения результирующего массива значение текущего». Обычная «перекачка» была бы самым плохим решением.

program выбор (учреждение, output);
const n=50;
type служащий = record имя:packed array [1..20] of char;
возраст: 1920..1980;
пол:(М,Ж);
должность:(лб,тх,инж,нс,адм,завотд,замдир,дир);
специальность:(мтмтк,пргрммст,мхнк,элктрнк,
экнмст,фзк,хмк,юрст);
отдел: 1..32;
черта:packed array[1..1024]of char
end;
var отделтекущий, отделрезультат,R:^array [1..50] of служащий;
номотдела,номрезотдела:1..32;
сотрудник:служащий;
числонс,maxнс,i,j:integer;
учреждение:file of служащий;

begin maxнс:=0;
{порождение динамических массивов}
new(отделтекущий);new(отделрезультат);
for i:= 1 to 32 do
begin{избрать из файла всех служащих из 1-го отдела}
номотдела:=i;
{подготовка файла учреждение к следующему просмотру}
reset(учреждение) {установили режим чтения};
j:=0; числонс:=0;
while not eof(учреждение) do
begin read(учреждение,сотрудник);j:=j+1;
if сотрудник.отдел=i then
begin отделтекущий^[j]:=сотрудник;
if сотрудник.должность=нсthen числонс:=числонс+1
end
end;
{если число нс в текущем отделе больше, чем в результирующем, то
взять в качестве новейшего значения результирующего массива значение
текущего}
if числонс>maxнс then
begin {перестановка ссылок}
maxнс:=числонс; номрезотдела:=номотдела;
R:=отделрезультат;
отделрезультат:=отделтекущий;
отделтекущий:=R
end
end
{вывод номера отдела}
write(maxнс,номрезотдела); writeln
end.

Следует направить внимание в данной программке на

перестановку ссылок, что устраняет нас от необходимости перекачки значений, из 1-го массива в иной;

недозволено путать окно файла учреждение^ и ссылочную переменную на объекты типа служащий.

5. Ликвидирование динамических объектов

Если в процессе вычислений некий динамический объект стал не нужен то его можно убить и высвободить занимаемую им память. Ликвидирование динамического объекта происходит при помощи процедуры

dispose (<имя ссылочной переменной>)

В итоге объект, на который указывала ссылочная переменная, исчезает ,а

С возникновением процедуры dispose в Pascal становится настоящая опасность, о которой мы гласили сначала лекции — ликвидирование объекта, на который указывают несколько переменных.

new(p); p^:=3;

d:=p; dispose(p);

Тут ошибка в том, что в итоге обрисованных действий переменная d показывает на объект, который закончил свое существование.


]]>