Отладка программы. Сегментация памяти - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Вот программа с недописанной логикой. Странно себе ведет. Если проследить путь, то в первом заходе в NewPosForOne при aSnow^.mVisible := False вылетает. Так же там aSnow^.mX и прочее имеет непонятные значения.
{$mode fpc}
 
program ScreenSaver;
 
uses
        crt;
 
type
        PSnow = ^TSnow;
 
        TSnow = record
                mX : Integer;
                mY : Integer;
                mColor : Word;
                mVisible : Boolean;
                mNext  : PSnow;
        end;
 
        TSnowList = object
                mSnow : PSnow;
                constructor Init(aX, aY : Integer; aColor : Word);
                procedure NewNode(aX, aY : Integer; aColor : Word);
                procedure SetNewPos(aMaxX, aMaxY : Integer);
        end;

        TScreen = object
                mMaxX : Integer;
                mMaxY : Integer;
                mMaxSnowObj : Integer;
                mSnowList   : TSnowList;
                constructor Init(aMaxX, aMaxY, aMaxSnowObj,
                        aX, aY : Integer; aColor : Word);
                function LifeLoop() : Boolean;
                //destructor Destroy();
        end;
 
{----HelpProc------}
procedure NewPosForOne(var aSnow : PSnow; aMaxX, aMaxY : Integer);
var
        Y : Integer;
        X : Integer;
begin
        X := aSnow^.mX + Random(3) + 1;
        Y := aSnow^.mY + Random(3) + 1;
        if (X > aMaxX) or (Y > aMaxY) then
                aSnow^.mVisible := False
        else begin
                aSnow^.mX := X;
                aSnow^.mY := Y;
        end;
end;
 
procedure WriteSnow(var aSnow : PSnow);
begin
        if (aSnow^.mVisible = True) then begin
                TextColor(aSnow^.mColor);
                GoToXY(aSnow^.mX, aSnow^.mY);
                Write('*');
        end;
end;

{------ClassMet------}
 
constructor TScreen.Init(aMaxX, aMaxY, aMaxSnowObj,
        aX, aY : Integer; aColor : Word);
begin
        mMaxX := aMaxX;
        mMaxY := aMaxY;
        mMaxSnowObj := aMaxSnowObj;
        mSnowList.Init(aX, aY, aColor);
end;
 
constructor TSnowList.Init(aX, aY : Integer; aColor : Word);
begin
        New(mSnow);
        mSnow^.mX := aX;
        mSnow^.mY := aY;
        mSnow^.mColor := aColor;
        mSnow^.mVisible := True;
        mSnow^.mNext := NIL;
end;
 
procedure TSnowList.NewNode(aX, aY : Integer; aColor : Word);
var
        Snow  : PSnow;
begin
        New(Snow);
        Snow := mSnow;
        while (Snow^.mNext <> NIL) do
                Snow := Snow^.mNext;
        New(Snow^.mNext);
        Snow^.mNext^.mX := aX;
        Snow^.mNext^.mY := aY;
        Snow^.mNext^.mColor := aColor;
        Snow^.mNext^.mNext := NIL;
        Dispose(Snow);
end;
 
procedure TSnowList.SetNewPos(aMaxX, aMaxY : Integer);
var
        Snow : PSnow;
begin
 
        Snow := mSnow;
        NewPosForOne(Snow, aMaxX, aMaxY);
        while (Snow^.mNext <> NIL) do begin
                Snow := Snow^.mNext;
                NewPosForOne(Snow, aMaxX, aMaxY);
        end;
        Dispose(Snow);
end;
 
function TScreen.LifeLoop() : Boolean;
var
        Snow : PSnow;
begin
        ClrScr();
        Snow := mSnowList.mSnow;
        WriteSnow(Snow);
        while (Snow^.mNext <> NIL) do
                WriteSnow(Snow);
        TSnowList.SetNewPos(mMaxX, mMaxY);
        Dispose(Snow);
end;
 
//destructor TSnowList.Destroy()
 
var
        Screen : TScreen;
 
begin
        Screen.Init(60, 30, 20, 1, 1, 5);
        repeat
                Screen.LifeLoop();
        until KeyPressed();
end.

Решение задачи: «Отладка программы. Сегментация памяти»

textual
Листинг программы
        New(Snow);
        Snow := mSnow;

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

  1. New - создает новый объект типа Snow.
  2. Snow - переменная, которая будет содержать ссылку на созданный объект.
  3. mSnow - переменная, которая содержит ссылку на объект Snow.

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


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

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

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