Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2010, 15:49   #1
NSvirus
пропагандирую жизЪ
Форумчанин
 
Аватар для NSvirus
 
Регистрация: 19.03.2007
Сообщений: 950
По умолчанию Проблема с переполнением кучи.

Это алгоритм затравочного заполнения 4хсвязной гранично-определенной области. В программе происходит переполнение кучи. Черт! Подскажите, что можно придумать, чтобы избежать этого?
Код:
uses crt,graph;
Type ukazat=^S;
  S=record
    inf:integer;
    Next:ukazat;
  end;
var
 u1,u2,u3,u4:ukazat;
 x,x1,y,y1,x2,y2:integer;
 dx,dy,d,i,z,kk:integer;
 o:boolean;
begin
  initgraph(x,y,'');
  rectangle(400,100,500,200);
  x1:=420;y1:=120;
  o:=false;
  new(u1);
  u4:=u1;
  u1^.inf:=x1;
  new(u1^.next);
  u1^.next^.inf:=y1;
  new(u1^.next^.next);
  u1:=u1^.next^.next;
  u3:=u1;
 while o=false do
  begin
    o:=true;
    u1:=u4;
    x1:=u1^.inf; y1:=u1^.next^.inf;
    putpixel(x1,y1,10);
    if getpixel(x1-1,y1)=0 then
      begin
        u1:=u3;
        u1^.inf:=x1-1;
        new(u1^.next);
        u1^.next^.inf:=y1;
        new(u1^.next^.next);
        u1:=u1^.next^.next;
        u3:=u1;
        o:=false;
      end;
    if getpixel(x1+1,y1)=0 then
      begin
        u1:=u3;
        u1^.inf:=x1+1;
        new(u1^.next);
        u1^.next^.inf:=y1;
        new(u1^.next^.next);
        u1:=u1^.next^.next;
        u3:=u1;
        o:=false;
      end;
    if getpixel(x1,y1-1)=0 then
      begin
        u1:=u3;
        u1^.inf:=x1;
        new(u1^.next);
        u1^.next^.inf:=y1-1;
        new(u1^.next^.next);
        u1:=u1^.next^.next;
        u3:=u1;
        o:=false;
      end;
    if getpixel(x1,y1+1)=0 then
      begin
        u1:=u3;
        u1^.inf:=x1;
        new(u1^.next);
        u1^.next^.inf:=y1+1;
        new(u1^.next^.next);
        u1:=u1^.next^.next;
        u3:=u1;
        o:=false;
      end;
    u1:=u4;
    u2:=u1;
    u1:=u1^.next;
    dispose(u2);
    u2:=u1;
    u1:=u1^.next;
    dispose(u2);
    delay(10000);
    u4:=u1;
  end;
 readln;
end.
Посторонним В.
NSvirus вне форума Ответить с цитированием
Старый 13.11.2010, 16:13   #2
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Можно поиграть с директивой Borland Pascal {$M}, например:
{$M размер_стека, размер_кучи}
Но вообще наверное где-то память просто за собой не освобождаете.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 13.11.2010, 16:50   #3
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

6 байт на каждый пиксель — многовато, пожалуй
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 14.11.2010, 19:27   #4
NSvirus
пропагандирую жизЪ
Форумчанин
 
Аватар для NSvirus
 
Регистрация: 19.03.2007
Сообщений: 950
По умолчанию

Все, разобрался. Если кому нужен исходник, выкладываю:

Код:
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.
Посторонним В.
NSvirus вне форума Ответить с цитированием
Старый 14.11.2010, 21:57   #5
артем19
Новичок
Джуниор
 
Регистрация: 14.11.2010
Сообщений: 1
По умолчанию

помогите решить пожалуйста легкое уровнение

составьте прогрумму, которая формирует массив из шестнадцати случайных целых чисел от -20 до 20 и:
находить элементы с нулевым значениями;
артем19 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очередь с приоритетами на базе кучи Nastenova Помощь студентам 1 15.06.2010 16:11
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37