| >VideoPtr^[i].Symbol:= '+'; { символом '+' в ярко- }
| >VideoPtr^[i].Attrib:=15+128 { белом цвете с мерцанием}
| >end {for};
| >ReadLn; { пауза до нажатия клавиши ввода }
| >{ Заполнение статического массива Vec: }
| >for i:=1 to 100 do Vec[i] := i*3.14;
| >MatPtr := Addr(Vec); {передача его адреса ссылке MatPtr}
{Теперь к 100 элементам одномерного массива Vec можно обращаться и как к элементам матрицы 10x10, используя разыменование ссылочной переменной MatrPtr^. Здесь мы распечатаем диагональные элементы матрицы: }
| >for i:=1 to 10 do WriteLn(' ':i, MatPtr^[i,i]:-9:2 );
| >ReadLn; { пауза до нажатия клавиши ввода }
| >{ и т.п. }
| END.
Рис. 11.8 (окончание)
Советуем внимательно рассмотреть пример на рис. 11.8. В нем нет ни процедур New/Dispose, ни GetMem/FreeMem! Динамические переменные здесь не создаются и не освобождаются. Взамен этого в ссылки «ручным способом» записываются адреса тех блоков памяти, с которыми мы хотели бы работать. А далее мы обращаемся с ними, как будто они есть структурированные динамические переменные.
Подобная техника открывает доступ к видеопамяти через любые структуры, позволяет проделывать такие вещи, как запись текстов с экрана на диск или их загрузку, подмену структур обращения к данным (как альтернатива приведению типов) и многое другое. Ссылки без кучи в последующих программах-иллюстрациях будут использоваться не раз, особенно при работе с видеопамятью.
11.7. Как организовать структуры, большие чем 64К?
Цифра 64K постоянно преследует разработчика больших программ. Сумма размеров всех глобальных переменных и типизированных констант не может превышать 64K. Размер типа тоже не может превышать 64K:
- 213 -
TYPE { матрица 200x200 }
Dim200x200 = Array [1..200, 1..200] of Real;
В таком описании размер типа равен 200x200x6 байт, что составит более 234К. Компилятор этого ни за что не пропустит, и переменная типа Dim200x200, понятно, не может быть объявлена. С другой стороны, эти 240K вполне могли бы разместиться в средних размеров куче. И это можно сделать!
Нужно лишь реорганизовать этот массив так, чтобы он распался на части, не превышающие по отдельности 64K каждая:
TYPE
Dim200 = Array [1..200] of Real;
Dim200Ptr = ^Dim200;
Dim200x200 = Array [1..200] of Dim200Ptr;
VAR
D : Dim200x200;
Здесь мы определяем тип Dim200 (тип строки матрицы) и тип ссылки на строку Dim200Ptr. После этого определяется тип матрицы 200x200 как статический массив из 200 ссылок на динамические массивы по 200 элементов. Последние вполне могут поместиться в куче. Тем более, что для каждого массива понадобится блок длиной 200x6 байт, а сами эти блоки могут размещаться в разных частях кучи. Размещение такой структуры немного усложнилось: