Проблема с переполнением кучи. - Pascal
Формулировка задачи:
Это алгоритм затравочного заполнения 4хсвязной гранично-определенной области. В программе происходит переполнение кучи. Черт! Подскажите, что можно придумать, чтобы избежать этого?
Решение задачи: «Проблема с переполнением кучи.»
textual
Листинг программы
uses crt,graph;
Type ukazat=^S;
S=record
inf:integer;
Next:ukazat;
end;
var
u1,u2,u3,u4:ukazat;
x1,y1,x2,y2:integer;
k:integer;
p,pp:byte;
o:boolean;
Procedure abc(p,pp:integer);
begin
u1:=u3;
u1^.inf:=x1+p;
new(u1^.next);
u1^.next^.inf:=y1+pp;
putpixel(x1+p,y1+pp,10);
new(u1^.next^.next);
u1:=u1^.next^.next;
u3:=u1;
inc(k);
end;
begin
initgraph(x1,y1,'');
Setcolor(10);
rectangle(10,100,100,200); x1:=11;y1:=120;
k:=0;
new(u1);
u3:=u1;u4:=u1;
abc(0,0);
readkey;
while k<>0 do
begin
u1:=u4;
x1:=u1^.inf; y1:=u1^.next^.inf;
if getpixel(x1-1,y1)=0 then abc(-1,0);
if getpixel(x1+1,y1)=0 then abc(1,0);
if getpixel(x1,y1-1)=0 then abc(0,-1);
if getpixel(x1,y1+1)=0 then abc(0,1);
u1:=u4; u2:=u1; u1:=u1^.next; dispose(u2);
dec(k);
u2:=u1; u1:=u1^.next; dispose(u2); u4:=u1;
end;
readln;
end.
Объяснение кода листинга программы
- Объявлены переменные:
- u1, u2, u3, u4: указатель на структуру S;
- x1, y1, x2, y2: целочисленный тип;
- k: целочисленный тип;
- p, pp: байтовый тип;
- o: логический тип;
- S: тип, определенный пользователем, являющийся записью с полями inf: integer и Next: указатель на S.
- Вызов функции new для выделения памяти под указатель u1^.next^.next.
- В функции abc присваиваются значения указателям u1, u1^.next и u1^.next^.next, а также вызывается функция new для выделения памяти под указатель u1^.next^.next^.next.
- В цикле while происходит движение указателей по связному списку, начиная с u4, и вызов функции abc с аргументами -1 и 0, если соответствующая клетка на экране пуста.
- После выхода из цикла while выполняется чтение ключа с помощью функции readkey.
- В конце программы выводится сообщение readln.