TURBO PASCAL

Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Гостевая книга

Благодарности

От автора

 

 

 

Пример использования большого массива данных

В задаче используется массив вещественных чисел размерности 100x200 Так как 100x200x6 = !2*104>65536 байт (размер сегмента данных), го. следовательно, данный массив нельзя разместить статически, то есть в сегменте данных. Так как 100x200x4 

8* 104>65536, то массив указателей на указанный массив вещественных чисел также нельзя разместить в сегменте данных.

Поэтому, разместим в сегменте данных указатели на начало строк двумерного массива вещественных чисел, то есть 100 указателей. Так как 100x4 = 400<65536, то эти указатели могут разместиться в сегменте данных. Каждый такой указатель будет указывать на первый байт строки данных. Зарезервируем для каждого такого указателя объем динамической памяти, равный длине строки, то есть 200x6 байт. Для этого используем процедуру GETMEM. Внутри каждой строки будем обращаться к адресу соответствующего вещественно! о числа по номеру столбца массива.

При последовательных обращениях к процедуре GETMEM начало очередного фрагмента резервируемой динамической памяти следует сразу за концом предыдущего и может не попасть на границу сегмента:

Оперативная память

tmp210-5.jpg

Максимальная длина такого фрагмента 65521 байт. Отсюда, если фрагмент начинается на !5-том байте внутри какого — то фрагмента и резервируется 65521 байт, то при обращении к последнему байту фрагмента смещение для этого байта будет равно 15+65521=65536, а 65536=15*4096. то есть будет указывать на границу • следующего сегмента. Но такое смещение невозможно реализовать с использованием 16-разрядного слова, так как 2'Л-65536 -1 -максимальное смещение для 16-разрядного слова. В данном случае возникает переполнение ячейки, вычисляющей смещение. Это необходимо учитывать. В остальных случаях проблем не возникает.

Вычисление адреса вещественного числа по I и J (I - номер строки массива, J -номер столбца массива)

С помощью процедуры GETMEM(PTRSTR(1), M*SIZEOF(REAL)) для каждой строки резервируем память (смотри рисунок):tmp210-6.jpg

Для первого элемента строки: номер сегмента 16*п; смешение - в диапазоне от О до 15. Отсюда адрес первого элемента строки: 16*п + смещение первого элемента. Адрес любого элемента строки: 16*п + (смещение первого элемента + (J-1)*длина вещественного числа). Пример:

Вычисление среднего арифметического двумерного массива случайных вещественных чисел.

program d_pointl; const

п=100; {Число строк массива} m=200; {Число столбцов массива} type

reaIpoint=Area!: var

i j : integer; {Индексные переменные массива} ptrsfr : array[l ..n] of pointer; {Массив указателей на начало размещения в

динамической памяти каждой строки матрицы} s,y : real; {Сумма элементов матрицы} function addr(ij : word) : reaipoint, {По номеру сгроки(0 и номеру столбца(]) выдает адрес вещественного числа типа real} begin

addr:-ptr(seg(ptrstr[iiA),ofs(ptrstrfi]A)+(j-l)*sizeof(reaI)) end;

function getr(ij : integer): real;

{Выдает значение вещественной переменной по номеру строки и номеру столбца массива} begin

getr:=addr(ij)A end;

procedure purr(ij : integer; x ; real);

{Присваивает переменной массива, имеющей номер строки i и номер столбца], вещественное значение} begin

addr(ij)A:=x end;

begin {Основная программа}

writeln('O6"oeM наибольшего непрерывного свободного блока кучи =',maxavail,' байт'); readln;

for i:=l to n do begin getmem(ptrstr[i],m*sizeof(real)}; {Резервирует память

под каждую строку массива} forj:=-l to m do begin

y:=random; {Присваивается случайное вещественное число} putr(ij.y) {Элементу- матрицы с индексами ij

присваивается число у} end end; s:=0;

writeln('O6beM наибольшего непрерывного свободного блока кучи =',maxavail,' байт'); readln;

for i:=l to ndo for |:=1 to m do s:=s+getr(i j); {Суммирование элементов массива}

writeln(s/(n*m):12:10); {Печать среднего}

release(heaporg) {Возвращает динамическую память в заданное состояние,

очищая ее с адреса, указанного в heaporg} end.

 

На первую страницу

 

Rambler's Top100 PROext: Top 1000 Rambler's Top100
(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz