Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640

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

09.09.2017, 23:33. Показов 962. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот программа с недописанной логикой. Странно себе ведет. Если проследить путь, то в первом заходе в NewPosForOne при aSnow^.mVisible := False вылетает. Так же там aSnow^.mX и прочее имеет непонятные значения.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
{$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.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.09.2017, 23:33
Ответы с готовыми решениями:

Отладка программы
Помогите отладит программу Составьте программу нахождения суммы двух наибольших из 3-х различных чисел program name; var...

Отладка программы
Помогите отладить программу Известен рост 3-х человек .Определите одинаков ли их рост Program name; var a,b,c:integer; ...

Отладка программы
Здравствуйте. У меня не как не выходит отладить программу. Компилятор ругается там и хочет вместо знака&gt; поставить :=. Где ошибка не как...

2
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
10.09.2017, 00:12
Pascal
89
90
        New(Snow);
        Snow := mSnow;
Получили память, указатель на нее в Snow, затем тут же потеряли выделенную память, затерев Snow.

Добавлено через 17 минут
В остальном, странная логика, потому и странно ведет себя.

Пересмотрите конструктор списка, ему незачем дублировать код добавления элемента. Почему бы не создавать просто пустой список? Добавление узла после этого тривиально:
Pascal
1
2
3
4
5
6
7
8
9
10
11
function NewSnow(ax, ay: Integer; acolor: Word; anext: PSnow): PSnow;
begin
  New(Result);
  with Result do begin
    x:=ax; y:=ay; color:=acolor; next:=anext;
  end;
end;
procedure TSnowList.AddSnow(ax, ay: Integer; color: Word);
begin
  mSnow:=NewSnow(ax,ay,color,mSnow);
end;
либо в один шаг
Pascal
1
2
3
4
5
6
7
8
procedure TSnowList.AddSnow(ax, ay: Integer; color: Word);
var t: PSnow;
begin
  New(t);
  with t^ do begin
    x:=ax; y:=ay; color:=acolor; next:=mSnow; mSnow:=t;
  end;
end;
1
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640
10.09.2017, 07:59  [ТС]
Я одного не пойму, почему при заходе SenNewPos mSnow вдруг получает Б-гу известные значения, а в итоге оказыввается что и память не выделена, хотя в процедуре которая ее вызывает все отлично.

Добавлено через 5 минут
Проблема в том что я вызывал метод класса TSnowList.SenNewPos а не объекта mSnowList.SenNewPos. Я вообще не знаю как оно в первом варианте заходило в процедуру несусествуещего класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2017, 07:59
Помогаю со студенческими работами здесь

отладка программы
2) В массиве С(6,6) поменять местами элементы относительно главной диагонали. максимально сократить программный код, сэкономить на...

Отладка программы!Текстовые файлы.
Здраствуйте....прошу помочь отладить прогу..! Задание такое... &quot;Дан текстовый файл содержащий слова резделенные знаками препинания....

Разработка и отладка программы в машинных кодах для замены местами байтов разных областей памяти
Разработка и отладка программы в машинных кодах для замены местами байтов разных областей памяти Вот такая сложн задача

Сегментация памяти
Здравствуйте. Стоит такая задача: Промоделировать сегментную память. Может кто знает как это делать, буду рад любой помощи. Искал в...

Сегментация памяти
Здравствуйте . Подскажите чему будет равен абсолютный адрес ? если адрес памяти равен 5:6. 0005:0006 ?? если да то почему ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru