Отладка программы. Сегментация памяти - 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;
Объяснение кода листинга программы
New
- создает новый объект типаSnow
.Snow
- переменная, которая будет содержать ссылку на созданный объект.mSnow
- переменная, которая содержит ссылку на объектSnow
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д