Друган попросил помочь разобраться с программой. Сам я не ахти кодер ;) да и он тоже. Вобщем постановка задачи: Требуется залить граничную область с использованием алгоритма заливки четырехсвязной области. Описание алгоритма на 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 итерации и завершается успешно? Компилил в Turbo C. Если запускать из самой среды, то прога глючит. Надо делать Мэйк и запускать полученный экзешник в консоли. Буду благодарен за любые советы. |