Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Практические примеры работы с несвязанными динамическими данными.




Пример 1. Определение адреса переменных и создание адреса.

Требуется определить адрес переменных i и x и создать ссылку (организовать адрес) на место в памяти, где располагается переменная i.

Program Segment;

Uses crt;

Var x:string; i:integer; k:^integer; p,p1:pointer; k2:^string;

addr_p,addr_p1,addr_k2:longint;

begin

x:=’Вeatles’; i:=66; clrscr;

p:=addr(i); p1:=@(x);

{функция addr(i) или операция взятия адреса @(i) служит для ‘привязывания’ динамических переменных к статическим. Иначе говоря, выдает значение типа Pointer, т.е. ссылку на начало объекта (переменной i) в памяти}

k:=ptr(seg(p^),ofs(p^));

{ seg(p^) -выдает адрес сегмента, в котором хранится объект (переменная i); ofs(p^) -смещение в сегменте, в котором хранится объект (переменная i); ptr -функция, противоположная addr, организует ссылку на место в памяти, определяемое сегментом и смещением (создает адрес).}

р1:=addr(p1^); { addr(p1^), @p1^,seg(p1^),ofs(p1^) – возврат содержимого

ссылки.}

k2:=p1; {работа с адресами, адреса равны и указывают на один и тот же объект

(переменную i)}

addr_p:=longInt(p); {приведение адреса (ссылки) к данному целому типу, к

десятичной системе счисления}

addr_p1:=longInt(p1);

addr_k2:=longInt(k2);

writeln(‘p=’,addr_p,’p1=’,addr_p1,’k2=’,addr_k2); {распечатаем адреса переменной i (ссылка р) и переменной х (ссылка р1 и к2) в десятичной системе счисления}

writeln(‘Адрес переменной х: сегмент’,seg(p),’смещение’,ofs(p));

{распечатаем адрес переменной х еще раз, используя функции ofs(p):word и seg(p):word}

writeln(k2^,’ ‘,k^); {распечатаем значения самих переменных}

readkey; end.

{результат, выданный на печать}

р=434110802 р1=434110546 к2=434110546

Адрес переменной х: сегмент 6624 смещениe 348

beatles 66

В интегрированной среде программирования Турбо Паскаль 7.0 в окне

параметров Watch можно увидеть адреса переменных i и х в шестнадцатиричной

системе счисления (рис.1.5).

Watch

p:Ptr($19E0,$152)

p1:Ptr($19E0,$52)

k2:Ptr($19E0,$52)

 

 
 


рис.1.5

Пример 2: Организация динамических структур, открывающих доступ к большей оперативной памяти.

Требуется организовать динамическую структуру данных типа двумерный массив, работающую с базовым типом real и размером более 64килобайт оперативной памяти.

Схематично структурная организация такого массива в оперативной памяти представлена на рис.1.6.

 

 

1-ая строка из 298 ячеек по 6 байт

2-ая строка из 298 ячеек по 6 байт

3-ья …

 


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

оверлейный буфер

сегмент данных.

Статический массив из 298 ссылок d:ptr298

       
   
 
 

 

 


Рис.1.6

Program BIG_KUCHA;

Uses crt;

Type Str298=array[1..298] of real;{тип строки матрицы}

Str298_ptr=^str298;{ссылка на строку матрицы}

Ptr298=array[1..298] of str298_ptr; {статический массив из 298 ссылок на

динамические массивы по 298 элементов типа real}

var d:ptr298;

i,j,k:integer;

begin

for i:=1 to 298 do new(d[i]); {выделение памяти в куче под вещественные строки}

for i:=1 to 298 do

for j:=1 to 298 do d[i]^[j]:=random*1000; {заполнение массива строк}

writeln(d[1]^[1]:6:4,d[298]^[298]:6:4);

for i:=1 to 298 do dispose(d[i]); {освобождение памяти в "кучe", занятой

строками}

readKey; end.

Таким образом оперативная память, выделенная в результате такой организации, составляет: 298*298*6 байт=532824 байта=520 килобайт.

Пример 3. Анализ состояния кучи.

Требуется определить ресурсы памяти перед размещением динамических переменных [2].

Program Test;

Type Dim=array[1..5000] of LongInt;

Var p:^Dim; {ссылка на базовый тип-массив}

Psize:LongInt;

Const sl=sizeof(LongInt); {размер одного элемента массива}

Begin

Writeln(‘В куче свободно’,MemAvail,’байт’);

{функция MemAvail выдает полный объем свободного пространства}

psize:=sl*(MaxAvail div sl);

{функция MaxAvail возвращает длину в байтах самого длинного свободного блока}

if sizeof(Dim)>Psize then

begin

writeln(‘Массив р^ не может быть размещен целиком’);

GetMem(p,Psize);{отводим сколько есть Psize байт}

Writeln(‘Размещено’,Psize div sl,’элементов’);

End

Else begin

New(p); {массив размещен, места достаточно}

Psize:=sizeof(Dim); {объем массива p^}

End;

FreeMem(p,Psize); {освобождение массива}

End.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...