69123

Масиви в динамічній пам’яті

Лекция

Информатика, кибернетика и программирование

Як уже зазначалось у розділі 10.2, зображення послідовностей однотипних у формі лінійних списків має і переваги, і недоліки. Основним недоліком є значна трудомісткістъ операції доступу до елемента лінійного списку за його номером. Цей недолік непритаманний масивам.

Украинкский

2014-09-30

37.5 KB

0 чел.

Лекція 32. Тема: Масиви в динамічній пам’яті

1. Масиви в динамічній пам’яті

Як уже зазначалось у розділі 10.2, зображення послідовностей однотипних у формі лінійних списків має і переваги, і недоліки. Основним недоліком є значна трудомісткістъ операції доступу до елемента лінійного списку за його номером. Цей недолік непритаманний масивам. Проте масиви, про які йшлося в розділі 7, мали іншу суттеву ваду — вони були статичними, тобто їх розмір визвачався під час розробки програми. У даному розділі розглядаютъся динамічні масиви, розмір яких визначається під час виконання програми і доступ до елементів яких здійснюється так само швидко, як і до елементів статичних масивів.

Динамічний масив ідентифікується покажчиком на його перший елемент. Базовий тип цього покажчика в мові Раsсаl оголошується у доволі спедифічний, порівняно з іншими мовами програмування, спосіб. А саме, він оголошується як тип одноелементного статичного масиву, базовий тип якого збігається із базовим типом динамичного масиву. Наприклад:

type arr=array[0..0] of integer;

var dynarr:^arr;

Тут dynarr - покажчик на динамічний масив даних типу integer, агг — тип того покажчика. Зауважимо, що, хоча згідно з синтаксисом покажчик dynarr посилається на одноелементний масив, процедурою GetMem (.див. розділ 10.1.4) можна виділити для цього покажчика довільний обсяг пам'яті, який не перевищує обсягу одного сегмента, тобто 64 Кбайта, або 65 536 байт. Тому за допомогою покажчика dynar можна посилатися на елементи масиву доволі великого обсягу. Наприклад:

GetMem(dynarr,1000*sizeof(integer));

i:=3;

dynarr^[i]:=1;

У цьому фрагменті коду було виділено пам'ять для динамічного масиву, що містить 1000 елементів типу integer, присвоєно значення 1 йоготретьому елементу. Тип змінної і має збігатися з типом індексів масиву, який було згадано в оголошенні типу агг. Тобто типом змінної і має бути один із цілочислових типів.

А як оперувати масивами, що їх розмір перевищує 64 Кбайт? Для цього можна створити масив покажчиків. Наприклад, масивом, який складається з 100 000 елементів типу integer можна оперувати, виділяючи пам 'ять під 10 000 елементів типу integer для кожного з 10 покажчиків:

type arr=array[0..0] of integer;

var p:array[0..9] of ^arr; i:integer;

for i:=0 to 9 do

   GetMem(p[i],10000*sizeof(integer));

i:=150;

p[2]^[i]:=1;

Вираз р[2]^[i] посилається на елемент 100 000-елементного масиву з індексом 20 150 = 10 000 *2+і. Взагалі, якщо кожна з частин великого масиву містить number елементів, то вираз р[j]^[k] посилається на елемент з індексом j*number+k. 1з цього випливає, що доступ до m-го елемента великого масиву можна здійснити за допомогою виразу р[m div number]^[m mod number].

Наостанок зауважимо: аби за допомогою одного й того самого покажчика можна було посилатися на динамічні масиви різних базових типів, цей покажчик слід оголошувати нетипізованим, а при згадуванні його імені використовувати операцію перетворення типів: <ім'я типу>(<ім'я покажчика>), Така техніка застосовується у прикладі 10.11.

Приклад 10.11

Потрібно отримати масив з 48 000 елементів типу longint. Оскільки зберігання елемента даних типу longint потребує чотирьох байтів пам'яті, зберігання всього масиву вимагатиме 4 * 48 000 = 192 000 байт пам'яті. Оскільки  3 • 65 536 = 196 608, то масив може бути розташований у трьох сегментах пам'яті, тобто складатися із трьох частин, кожна з яких міститьть 16 000 елементів.

У програмі ex10_8 елементам великого масиву присвоюються їх порядкові номери. На екран будуть виведені значення тих елементів, номери якіх кратні 4000. Результати роботи програми ex10_8 наведено на рис. 10.24.

program ex10_8;   {великі масиви в динамічній пам’яті}

const block=3;    {кількість блоків по 16000 елементів}

type arr=array[0..0] of longint;  {тип масиву}

      ptr=^arr;             {тип покажчика на масив}

var p:array[0..block] of pointer;   {масив покажчиків}

     number,     {кількість елементів у блоці}

     total:longint;   {загальна кількість елементів}

     j:longint;   {параметр циклу}

     i:integer    {допоміжна змінна}

begin

    number:=16000;

    total:=number*block;  {total=48000}

    writeln(‘free memory:’,memavail,’;max area:’,maxavail);

    for i:=0 to block-1 do   {виділити динамічну пам’ять}

     getmem(p[i],number*sizeof(longint));

    for j:=0 to total-1 do     {записати у пам’ять значення}

      ptr(p[j div number])^[j mod number]:=j;

    i:=0;   {і – номер стовпчика чисел}

    j:=0;   

    while j<total do    {вивести масив}

    begin

       write (ptr(p[j div number])^[j mod number]:8);

       i:=i+1;

       if i=4 then begin writeln; i:=0 end;

       j:=j+4000;

     end;

     writeln;

     writeln(‘free memory:’,memavail,’; max area’,maxavail);

     readln;

end.

    


 

А также другие работы, которые могут Вас заинтересовать

83617. Типы проводников, применяемые в основных электрических цепях 29.51 KB
  Все соединения внутри закрытого РУ 610 кВ включая сборные шины выполняются жесткими голыми алюминиевыми шинами прямоугольного или коробчатого сечения. Токоведущие части в РУ 35 кВ и выше обычно выполняются сталеалюминиевыми проводами АС. В некоторых конструкциях ОРУ часть или вся ошиновка может выполняться алюминиевыми трубами. От стены ГРУ до выводов установленного вблизи ГРУ соединение выполняется жесткими алюминиевыми шинами.
83618. Выбор кабелей, марки кабелей 43.25 KB
  Если условия применения проводов и кабелей отличаются от приведённых то длительно допустимые токовые нагрузки пересчитывают по формуле: I\'доп=Iдоп K1K2 где Iдоп длительно допустимый ток одиночного кабеля провода; K1 коэффициент учитывающий количество кабелей; К2 коэффициент допустимой перегрузки кабельной линии. Для кабелей напряжением до 10 кВ с бумажной пропитанной изоляцией несущих нагрузки меньше номинальных для таких кабелей допускается перегрузки в течение 5 суток в пределах указанных в таблицах справочника. Для кабелей с...
83619. Виды и системы освещения 30.21 KB
  Освещение безопасности предназначено для продолжения работы при аварийном отключении рабочего освещения. Светильники рабочего освещения и светильники освещения безопасности должны питаться от независимых источников. Устройство рабочего освещения обязательно во всех помещениях независимо от устройства в них других видов освещения.
83620. Расчет искусственного освещения методом коэффициента использования 43.18 KB
  1 где Е заданная минимальная освещенность лк; Кзап коэффициент запаса; коэффициент минимальной освещенности приближенно можно принимать z = 11 для люминесцентных ламп z = 115 для ламп накаливания и ДРЛ; S освещаемая площадь м2; Еср средняя освещенность лк; N число светильников намечается до расчета коэффициент использования светового потока источника света доли единиц. Если такое приближение не реализуется то корректируется число светильников. Если световой поток ламп в каждом светильнике составляет...
83621. Точечный метод расчета освещенности 93.26 KB
  Расположение контрольной точки А при размещении светильников по углам квадрата и В по сторонам прямоугольника 3 по пространственным изолюксам горизонтальной освещенности находится освещенность е от каждого светильника; 4 находится общая условная освещенность от всех светильников ∑е; 5 рассчитывается горизонтальная освещенность от всех светильников в точке А: Еа = F х μ 1000х kз х ∑е где μ коэффициент учитывающий дополнительную освещенность от удаленных светильников и отраженного светового потока kз коэффициент запаса. Порядок по...
83622. Порядок расчета рабочего освещения любого цеха 73.69 KB
  Наметим число светильников в ряду: шт. тогда расстояние от торцевых стен до крайнего светильника составит: Расстояние от крайних светильников до стены принимается 03L 05L в зависимости от наличия рабочих мест у стен. Выберем расстояние между рядами LB при этом необходимо учесть следующее условие: Примем LB = 4м; Расстояние от боковых стен до крайних светильников составит: 5. Число светильников в цехе: Размещение светильников представлено на рис.
83623. Расчет аварийного освещения 28.4 KB
  Оно должно быть достаточным для безопасного выхода людей из помещения и продолжения работы в помещениях и на открытых пространствах в тех случаях когда отключение рабочего освещения может вызвать пожар взрыв отравление газами парами длительное расстройство технологического процесса нарушение работы важнейших объектов водоснабжение электростанции узлы радиопередачи и т. Для аварийного освещения разрешается применять как лампы накаливания так и люминесцентные лампы последние при минимальной температуре воздуха не менее 10 С.75...
83624. Расчёт осветительной сети 34.54 KB
  Освещение безопасности предназначено для продолжения работы при аварийном отключении рабочего освещения. Светильники рабочего освещения и светильники освещения безопасности должны питаться от независимых источников. Устройство рабочего освещения обязательно во всех помещениях независимо от устройства в них других видов освещения. Светильники аварийного освещения рекомендуется по возможности выделять из числа светильников рабочего освещения.
83625. Картограмма нагрузок. Определение условного центра электрических нагрузок 56.37 KB
  Определение условного центра электрических нагрузок. Картограмма нагрузок. Для определения места положения ГПП ТП при проектировании системы электроснабжения на генеральный план промышленного предприятия наносится картограмма нагрузок которая представляет собой размещённые на генеральном плане окружности причём площади ограниченные этими окружностями в выбранном масштабе равны расчётным нагрузкам цехов.