Освобождение памяти - 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.

Объяснение кода листинга программы

  1. В программе используется библиотека Dos и модуль Crt.
  2. В программе используются две переменные типа Integer: x и y, которые представляют координаты спрайта.
  3. Используется переменная типа Byte: img и back, которые представляют массивы, используемые для хранения изображения спрайта и его фона соответственно.
  4. Используется переменная типа TSprite: sprt, которая представляет объект спрайта.
  5. Используется переменная типа TSpriteArr: sprtarr, которая представляет массив, используемый для хранения изображения спрайта.
  6. Используется переменная типа Registers: r, которая представляет регистры процессора.
  7. Используется переменная типа Byte: port, которая представляет порт ввода/вывода.
  8. Используется переменная типа File: f, которая представляет файл.
  9. В процедуре GraphBegin происходит инициализация регистров процессора и портов ввода/вывода.
  10. В процедуре SetBMPPalette происходит установка палитры BMP файла.
  11. В процедуре CreateSprite создается новый спрайт с заданными координатами и размерами.
  12. В процедуре GetBuffer происходит чтение изображения спрайта из памяти.
  13. В процедуре PutBuffer происходит запись изображения спрайта в память.
  14. В процедуре PutSprite происходит запись изображения спрайта в память, если его цвет не является прозрачным.
  15. В процедуре PutBackground происходит запись случайного цвета в память для создания фона.
  16. В процедуре CalcSpritePosition происходит расчет новых координат спрайта при необходимости.
  17. В процедуре GraphEnd происходит завершение работы с графикой.
  18. Программа начинается с вызова процедуры GraphBegin, за которым следует создание спрайта, установка палитры, чтение изображения, повторное чтение изображения и запись изображения до тех пор, пока не будет нажата клавиша.
  19. После этого происходит уничтожение спрайта и завершение работы с графикой.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы