Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Нужна помощь с курсовой программой


Автор: localhost 26.5.2006, 20:37
Друган попросил помочь разобраться с программой. Сам я не ахти кодер ;) да и он тоже. Вобщем постановка задачи: Требуется залить граничную область с использованием алгоритма заливки четырехсвязной области. Описание алгоритма на http://algolist.manual.ru/graphics/fill.php Один препод вузовский накатал прогу, к-рая нихрена не работает  <_< Заливает только 4 пиксела (соседних) и все.
Листинг программы
Код

#include <graphics.h>
#include <alloc.h>
#include <stdio.h>
#include <conio.h>

#define PixToStek      1
#define ColBorder     15
#define ColFlood       5
#define MAXSTEK     8192

struct STEK
{
   int x,y;
};

unsigned char *Mat[300];
STEK *st=NULL;
int u_st=-1;
int st_mx=MAXSTEK;

int AddStek(int x,int y)
{
  if(u_st >= st_mx) return 1;
  if(Mat[x][y] != PixToStek &&
     Mat[x][y] != ColBorder &&
     Mat[x][y] != ColFlood)
     {
    u_st++;
    st[u_st].x=x;
    st[u_st].y=y;
    Mat[x][y]=PixToStek;
     }
  return 0;
}
int DelStek(int *x,int *y)
{
    *x=st[u_st].x;
    *y=st[u_st].y;
    u_st--;
  return 0;
}

void main (void)
{
   int   i,j,ii;
   int   xs, ys;
   int   gdriver = DETECT, gmode;

   initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
   if ((ii= graphresult()) != grOk)
   {
      printf ("Err=%d\n", ii); return;
   }

   for(i=0; i< 300; i++)
   {
       Mat[i]=NULL;
       Mat[i]=(unsigned char *)malloc(300);
       if(Mat[i] == NULL)
       {
      for(j=i-1; j>= 0; j--) {free(Mat[j]); Mat[j]=NULL;}
      return ;
       }
       for(j=0; j< 300; j++)
       {
       Mat[i][j]=0; putpixel(i,j,0);
       if((i == 100 || i == 250) && (j >= 20 && j <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       if((j ==  20 || j == 250) && (i >=100 && i <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       }
   }

   st=(STEK *)malloc(MAXSTEK*sizeof(STEK));

   xs = 200; ys= 100; AddStek(xs,ys);
   int xz,yz;

   while (u_st>=0)
   {
    xz=yz=0;
    DelStek(&xz,&yz);
    Mat[xz][yz]=ColFlood;
    putpixel(xz,yz,ColFlood);

    AddStek(xs+1,ys);
    AddStek(xs,ys-1);
    AddStek(xs-1,ys);
    AddStek(xs,ys+1);
   }

   getch();
   closegraph();
   for(j=0; j< 300; j++) {free(Mat[j]); Mat[j]=NULL;}
   return ;
}


Нужно найти ошибку. Почему она проходит только 4 итерации и завершается успешно?  smile Компилил в Turbo C. Если запускать из самой среды, то прога глючит. Надо делать Мэйк и запускать полученный экзешник в консоли.
Буду благодарен за любые советы. 

Автор: NextAlex 27.5.2006, 22:33
потому что прога немного недописана - этот код как раз только то и делает что заливает четыре точки вокруг базовой, а по сути это и есть весь код заливки области
Код

while (u_st>=0)    
   {    
    xz=yz=0;    
    DelStek(&xz,&yz);    
    Mat[xz][yz]=ColFlood;    
    putpixel(xz,yz,ColFlood);    
    AddStek(xs+1,ys);    
    AddStek(xs,ys-1);    
    AddStek(xs-1,ys);    
    AddStek(xs,ys+1);    
   }


сейчас попробую переделать, но поскольку турбо С у меня нет, и вообще с графикой в консоли я довно не работаю, то могу конечно и ошибиться где-то ... 

Автор: NextAlex 27.5.2006, 23:06
вот это должно работать
в графике не проверял, но по счетчику были залиты все точки ...
Код

#include <graphics.h>
#include <alloc.h>
#include <stdio.h>
#include <conio.h>
#define PixToStek      1
#define ColBorder     15
#define ColFlood       5
#define MAXSTEK     8192
struct STEK
{
   int x,y;
};
unsigned char *Mat[300];
STEK *st=NULL;
int u_st=-1;
int st_mx=MAXSTEK;

int AddStek(int x,int y)
{
  if(u_st >= st_mx) return 1;
  if(Mat[x][y] != PixToStek &&
     Mat[x][y] != ColBorder &&
     Mat[x][y] != ColFlood)
     {
    u_st++;
    st[u_st].x=x;
    st[u_st].y=y;
    Mat[x][y]=PixToStek;
    putpixel(x,y,ColFlood);
    AddStek(x+1,y);
    AddStek(x,y-1);
    AddStek(x-1,y);
    AddStek(x,y+1);
     }
  return 0;
}

int main ()
{
   int   i,j,ii;
   int   xs, ys;
   int   gdriver = DETECT, gmode;
   initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
   if ((ii= graphresult()) != grOk)
   {
      printf ("Err=%d\n", ii); return;
   }
   for(i=0; i< 300; i++)
   {
       Mat[i]=NULL;
       Mat[i]=(unsigned char *)malloc(300);
       if(Mat[i] == NULL)
       {
       for(j=i-1; j>= 0; j--) {
            free(Mat[j]);
            Mat[j]=NULL;
        }
      return 1;
       }
       for(j=0; j< 300; j++)
       {
       Mat[i][j]=0;
       putpixel(i,j,0);
       if((i == 100 || i == 250) && (j >= 20 && j <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       if((j ==  20 || j == 250) && (i >=100 && i <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       }
   }
   st=(STEK *)malloc(MAXSTEK*sizeof(STEK));

   xs = 200; ys = 100;
   AddStek(xs,ys);

   getch();
   for(j=0; j< 300; j++) {free(Mat[j]); Mat[j]=NULL;}
   return 0;
}
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)