Схема организации хранения данных и программ в ОЗУ RAM KB MS-DOS Turbo Pascal Программа Русификатор Сегмент кода Сегмент данных max 64 КБ Динамически выделяемая память heap= куча В сегменте данных располагаются все глобальные переменные, описанные в программе (секция var)
Указатели Сегмент данных данные p В переменной-указателе хранится адрес, по которому располагаются данные в динамической памяти nil – «нулевой» адрес
Указатели в Pascalе Типизированные Нетипизированные ^integer ^string ^real pointer
Типизированные указатели new(p); - выделяет в динамической памяти область и заносит её адрес в переменную p dispose(p); - освобождает выделенную ранее область в динамической памяти p^ := …; - пример обращения к данным, лежащим по адресу, хранящемуся в p
Типизированные указатели var a,b: integer; p: ^integer; begin new(p); a:=3; b:=5; p^:=a+b; writeln(p^); dispose(p); end. abp 8 35
var a: integer; p1,p2: ^integer; begin new(p1); a:=3; p2:=p1; p1^:=a; a:=4; p2^:=2*a; writeln(p1^); dispose(p1); end. ap1p
Нетипизированные указатели GetMem(p,size); - выделяет в динамической памяти область размером size байт и возвращает её адрес в переменную p FreeMem(p,size); - освобождает занятую ранее область в динамической памяти
Использование динамической памяти при анимации «простой» объект – можно перерисовывать при анимации «сложный» объект – долго перерисовывать при анимации
Использование динамической памяти при анимации Идея использования динамической памяти при анимации: 1)рисуем объект 2)сохраняем его изображение в динамической памяти 3)используем сохранённое изображение для анимации
GetImage(x1,y1,x2,y2,BitMap); - сохраняет прямоугольную область экрана, заданную координатами (x1,y1,x2,y2) в переменную BitMap ImageSize(x1,y1,x2,y2): word; - возвращает размер памяти, необходимый для хранения прямоугольной области экрана, заданной координатами (x1,y1,x2,y2) PutImage(x,y,BitMap,mode); - выводит на экран сохранённую ранее прямоугольную область экрана в соответствии с установленным в mode режимом вывода, где (x,y) – координаты левого верхнего угла
var p: pointer; s,x: word; … begin … s:=ImageSize(10,10,50,50); GetMem(p,s); GetImage(10,10,50,50,p^); ClearDevice; for x:=0 to GetMaxX div 5 do begin PutImage(x*5,100,p^,XORPut); delay(5000); PutImage(x*5,100,p^,XORPut); end; … end.
Л/р «Pac-Man» фаза 1 фаза 2 фаза 0 ф 1 ф 2 яблоко