Практические примеры работы с несвязанными динамическими данными.
Пример 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 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|