Освобождение памяти - Turbo Pascal
Формулировка задачи:
При работе со спрайтами после 3 удара спрайта об стенку экрана, программа прерывается. Вроде заканчивается память. Подскажите как это исправить(освободить память).
Если что вот программа.
Решение задачи: «Освобождение памяти»
textual
Листинг программы
program sprite; uses Dos, Crt; const xSize=40; ySize=40; TransparentColor=$ff; type TSpriteArr=array [0..ysize-1,0..xsize-1] of Byte; TSprite=record x, y: Word; dy, dx: Integer; img, back: ^TSpriteArr; end; TScreen= array [0..199,0..319] of Byte; TFile=file; var sprt: TSprite; scr: ^TScreen; r: Registers; f: TFile; procedure GraphBegin; begin r.ax:=$13; Intr($10,r); scr:=Ptr(SegA000,0); end; procedure SetBMPPalette; var i, j: Integer; bgrc: array [0..3] of Byte; begin Seek(f,54); Port[$3c6]:=$ff; for i:=0 to 255 do begin BlockRead(f,bgrc,SizeOf(bgrc)); Port[$3c8]:=i; for j:=2 downto 0 do Port[$3c9]:=bgrc[j]; end; end; procedure CreateSprite(const s: String; x,y,dx,dy: Integer); begin GetMem(sprt.img,SizeOf(TSpriteArr)); GetMem(sprt.back,SizeOf(TSpriteArr)); Assign(f,'sprt.bmp'); Reset(f,1); Seek(f,1078); BlockRead(f,sprt.img^,xsize*ysize); SetBMPPalette; sprt.x:=x; sprt.y:=y; sprt.dx:=dx; sprt.dy:=dy; Close(f); end; procedure GetBuffer; var i, j: Integer; begin for i:=0 to ySize-1 do for j:=0 to xSize-1 do with sprt do back^[i,j]:=scr^[i+y,j+x]; end; procedure PutBuffer; var i, j: Integer; begin for i:=0 to ySize-1 do for j:=0 to xSize-1 do with sprt do scr^[i+y,j+x]:=back^[i,j]; end; procedure PutSprite; var i, j: Integer; begin for i:=0 to ySize-1 do for j:=0 to xSize-1 do with sprt do if img^[i,j]<>TransparentColor then scr^[i+y,j+x]:=img^[i,j]; end; procedure PutBackground; var i, j: Integer; begin for i:=0 to 199 do for j:=0 to 319 do scr^[i,j]:=Random(256); end; procedure DestroySprite; begin FreeMem(sprt.back,SizeOf(TSpriteArr)); FreeMem(sprt.img,SizeOf(TSpriteArr)); end; procedure CalcSpritePosition; begin with sprt do begin if (x+xSize+dx>=319) or (x+dx<=0) then dx:=-dx; if (y+ySize+dy>=199) or (y+dy<=0) then dy:=-dy; Inc(x,dx); Inc(y,dy); end; end; procedure GraphEnd; begin r.ax:=$03; Intr($10,r); end; begin GraphBegin; CreateSprite('sprt.bmp',0,0,3,3); PutBackground; GetBuffer; repeat PutBuffer; CalcSpritePosition; GetBuffer; PutSprite; {while port[$3da] and 8=0 do;} Delay(100); until KeyPressed; if ReadKey=#0 then ReadKey; DestroySprite; GraphEnd; end.
Объяснение кода листинга программы
- В программе используется библиотека Dos и модуль Crt.
- В программе используются две переменные типа Integer: x и y, которые представляют координаты спрайта.
- Используется переменная типа Byte: img и back, которые представляют массивы, используемые для хранения изображения спрайта и его фона соответственно.
- Используется переменная типа TSprite: sprt, которая представляет объект спрайта.
- Используется переменная типа TSpriteArr: sprtarr, которая представляет массив, используемый для хранения изображения спрайта.
- Используется переменная типа Registers: r, которая представляет регистры процессора.
- Используется переменная типа Byte: port, которая представляет порт ввода/вывода.
- Используется переменная типа File: f, которая представляет файл.
- В процедуре GraphBegin происходит инициализация регистров процессора и портов ввода/вывода.
- В процедуре SetBMPPalette происходит установка палитры BMP файла.
- В процедуре CreateSprite создается новый спрайт с заданными координатами и размерами.
- В процедуре GetBuffer происходит чтение изображения спрайта из памяти.
- В процедуре PutBuffer происходит запись изображения спрайта в память.
- В процедуре PutSprite происходит запись изображения спрайта в память, если его цвет не является прозрачным.
- В процедуре PutBackground происходит запись случайного цвета в память для создания фона.
- В процедуре CalcSpritePosition происходит расчет новых координат спрайта при необходимости.
- В процедуре GraphEnd происходит завершение работы с графикой.
- Программа начинается с вызова процедуры GraphBegin, за которым следует создание спрайта, установка палитры, чтение изображения, повторное чтение изображения и запись изображения до тех пор, пока не будет нажата клавиша.
- После этого происходит уничтожение спрайта и завершение работы с графикой.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д