프로그래밍

 3198, 1/160 회원가입  로그인  
   목탁든교황님
   [C언어]스택 오버플로우 에러... 0xC00000FD : Stack overflow

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2997 [복사]


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

int bak[20][20]={0};
int dolBTF, dolBTS, dolWTS, dolWTF, doli, dolj, cnte=0;

///////////////////////////////////////////////////////////////////////////////////////////////////

int gameb(int dolBF, int dolBS)
{
        int dolcnt=0;
        dolBF=dolBTF;
        dolBS=dolBTS;
        if(cnte>0)
        {
                if(bak[dolBF][dolBS]==1)
                {
                        cnte++;
                        if(cnte==5)
                        {
                                return 25;
                        }
                        dolBTF=dolBF+doli;
                        dolBTS=dolBS+dolj;
                        gameb(dolBF, dolBS);
                }
        }
        if(dolcnt<7)
        {
                cnte=1;
                if(dolcnt==0)
                {
                        doli=-1;
                        dolj=-1;
                        gameb(dolBF, dolBS);
                }
                else if(dolcnt==1)
                {
                        doli=-1;
                        dolj=0;
                        gameb(dolBF, dolBS);
                }
                else if(dolcnt==2)
                {
                        doli=-1;
                        dolj=1;
                        gameb(dolBF, dolBS);
                }
                else if(dolcnt==3)
                {
                        doli=0;
                        dolj=-1;
                        gameb(dolBF, dolBS);
                }
                else if(dolcnt==4)
                {
                        doli=0;
                        dolj=1;
                        gameb(dolBF, dolBS);
                }
                else if(dolcnt==5)
                {
                        doli=1;
                        dolj=-1;
                        gameb(dolBF, dolBS);
                }
                else if(dolcnt==6)
                {
                        doli=1;
                        dolj=0;
                        gameb(dolBF, dolBS);
                }
                else
                {
                        doli=1;
                        dolj=1;
                        gameb(dolBF, dolBS);
                }
                dolcnt++;
        }
        return 10;
}

////////////////////////////////////////////////////////////////////////////////////////////////

int gamew(int dolWF, int dolWS)
{
        int dolcnt=0, cnt=0;
        dolWF=dolWTF;
        dolWS=dolWTS;
        if(cnte>0)
        {
                if(bak[dolWF][dolWS]==2)
                {
                        cnte++;
                        if(cnte==5)
                        {
                                return 25;
                        }
                        dolWTF=dolWF+doli;
                        dolWTS=dolWS+dolj;
                        gamew(dolWF, dolWS);
                }
        }
        if(dolcnt<7)
        {
                cnte=1;
                if(dolcnt==0)
                {
                        doli=-1;
                        dolj=-1;
                        gamew(dolWF, dolWS);
                }
                else if(dolcnt==1)
                {
                        doli=-1;
                        dolj=0;
                        gamew(dolWF, dolWS);
                }
                else if(dolcnt==2)
                {
                        doli=-1;
                        dolj=1;
                        gamew(dolWF, dolWS);
                }
                else if(dolcnt==3)
                {
                        doli=0;
                        dolj=-1;
                        gamew(dolWF, dolWS);
                }
                else if(dolcnt==4)
                {
                        doli=0;
                        dolj=1;
                        gamew(dolWF, dolWS);
                }
                else if(dolcnt==5)
                {
                        doli=1;
                        dolj=-1;
                        gamew(dolWF, dolWS);
                }
                else if(dolcnt==6)
                {
                        doli=1;
                        dolj=0;
                        gamew(dolWF, dolWS);
                }
                else
                {
                        doli=1;
                        dolj=1;
                        gamew(dolWF, dolWS);
                }
                dolcnt++;
        }
        return 10;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

int main()
{
select:

        char menu;
        int i, j, cnt=0;
        int dolBF, dolBS, dolWF, dolWS, B=0, W=0;
        int change=0;
        int asd=0, qwe=0;

        printf("Game Start        :  S  \n");
        printf("Game Rules        :  R  \n");
        printf("Game Use System   :  U \n");
        printf("Game End          :  E \n");
        printf("\n\n\n\n\n\n\n\n\n\n\n\n");
        printf("Select            :  ");
        menu = getche();
        printf("\n\n\n");

        if(menu=='S')
                goto Start;
        else if(menu=='E')
                return 0;
        else if(menu=='R' || menu=='U')
        {
                printf("\t 준비중 \n\n\n");
                goto select;
        }
        else
        {
                printf("  ERROR : 존재하지 않는 명령어 입니다.\n\n\n");
                goto select;
        }


Start:

        printf("    ");                                // 게임 시작
        for(i=1 ; i<=19 ; i++)
        {
                printf("%2d", i);
        }
        printf("\n");
        for(i=1 ; i<=19 ; i++)
        {
                printf("%3d ", i);
                for(j=1 ; j<=19 ; j++)
                {
                        printf("┼");                // 바둑알, 바둑판 출력
                }
                putchar('\n');
        }

        while(1)
        {
                printf("\n───────────────────────\n");
                if(change % 2 == 0)                                                        // 흑돌 턴
                {
                        printf("흑돌 차례 입니다. (기권 : 좌표(100 100)  )\n");
                        scanf("%d %d", &dolBF, &dolBS);
                        if(bak[dolBF][dolBS]==0)
                                bak[dolBF][dolBS]=1;
                        else
                        {
                                printf("\n그곳엔 바둑돌이 있습니다. 다시 두십시오\n");
                                continue;
                        }
                        if(bak[100][100]==1)        // 흑 기권, 백 승
                        {
                                W++;
                                break;
                        }
                }
                else                                                                                // 백돌 턴
                {
                        printf("백돌 차례 입니다. (기권 : 좌표(100 100)  )\n");
                        scanf("%d %d", &dolWF, &dolWS);
                        if(bak[dolWF][dolWS]==0)
                                bak[dolWF][dolWS]=2;
                        else
                        {
                                printf("\n그곳엔 바둑돌이 있습니다. 다시 두십시오\n");
                                continue;
                        }
                        if(bak[100][100]==2)                // 백 기권, 흑 승
                        {
                                B++;
                                break;
                        }
                }
                printf("\n───────────────────────\n");
                printf("    ");
                for(i=1 ; i<=19 ; i++)
                {
                        printf("%2d", i);
                }
                printf("\n");
                for(i=1 ; i<=19 ; i++)
                {
                        printf("%3d ", i);
                        for(j=1 ; j<=19 ; j++)
                        {
                                if(bak[i][j]==1)
                                        printf("○");        // 바둑알, 바둑판 출력
                                else if(bak[i][j]==2)
                                        printf("●");
                                else
                                        printf("┼");
                        }
                        putchar('\n');
                }
                if(change % 2 == 0)                // 누가누가 이겼나 (흑)
                {
                        qwe=gameb(dolBF, dolBS);
                        if(qwe==25)
                        {
                                B++;
                                break;
                        }
                }
                else                // 누가누가 이겼나 (백)
                {
                        asd=gamew(dolWF, dolWS);
                        if(asd==25)
                        {
                                W++;
                                break;
                        }
                }
                cnte=0;
                change++;
        }

/////////////////////////////////////////////////////////////////////////////////////////////////

        if(B>W)
                printf("흑 승");
        else
                printf("백 승");
        printf("\n메뉴로 돌아가시겠습니까? Y/N  :  ");
        menu = getche();
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        if(menu=='Y')
                goto select;

        return 0;
}














하하하하....

친구한테 제가 컴퓨터 공부 시작했다고 했더니

친구가 게임 만들줄 아냐? 라기에

아니라고 했지만

오목이라도 만들어오면 점심 쏜다고 해서

지금 몇시간째 씨름하고 있는데 (엄청난 노가다로 인해)

마지막에서 스택 오버플로우를 보고는 좌절에 빠졌습니다.

제, 제길! 다왔는데!

오버플로우에 빠진곳은 딱 봐도 아시겠지만

분명히 제가 만든 함수에서 발생했을 것입니다.

아마 앞에 전역변수들

int bak[20][20]={0};
int dolBTF, dolBTS, dolWTS, dolWTF, doli, dolj, cnte=0;

때문에 그런가요?

아, 잘 모르겠네.;;

시험 끝나고 띵가띵가 놀다가 몇달만에 컴퓨터를 잡았는데

실제론 처음보는 오버플로우가 뜨다니!

좀 해결해주세요 ㅠㅠㅠ 점심 외식 하고 싶어요ㅠㅠ


복사해서 컴파일 해보시구 오류 해결해주셔두 되요 ㅠㅠ

좀 부탁드려요 ㅠㅠ

  Hit : 10516     Date : 2011/05/13 07:19



    
화련한 게임을 시작하고, 흑의 돌을 하나 둔 다음에, 바둑판을 출력한 뒤 gameb 함수로 들어가더군요.
그 뒤에는 if(cnte>0)을 지나치고,
if(dolcnt < 7) 이 구문에서 걸린 뒤
cnte = 1;
if(dolcnt == 0){
...
gameb(dolBF,dolBS); <---- 여기에 gameb가 다시 호출됩니다.

그렇게 계속 gameb가 호출되다 보면 결국 스택이 터져버리죠.

실제로 스택 프레임을 보니 똑같은 gameb가 계속 호출되더라구요.

이 부분은 오목 조건을 체크하는 부분인것 같은데, dolcnt값도 안바뀌고 dolBF,. dolBS도 바뀌지 않으니

조건이 변하지 않아서 똑같은 부분을 똑같이 호출합니다.
2011/05/14  
목탁든교황님 와 성부와 성자와 성령의 이름으로 당신이 진리입니다.
그렇군요.
그런데 다시봐도 제가 짠 알고리즘을 봐도 모르겠네요;;
아....
이럴수가...
2011/05/14  
목탁든교황님 그런데 나머진 다 알겠는데
dolBF=dolBTF;
dolBS=dolBTS;
if(cnte>0)
{
if(bak[dolBF][dolBS]==1)
{
cnte++;
if(cnte==5)
{
return 25;
}
dolBTF=dolBF+doli;
dolBTS=dolBS+dolj;
gameb(dolBF, dolBS);
}
}
여기서 dolBTF를 다음번에 dolBF로 다시 바꿔주기 때문에 다른값 호출하는거 아닙니까?
처음엔 dolBS >> dolBS+doli >> dolBS+doli+doli >> dolBS+doli+doli+doli 이렇게
되는거 아닙니까?
이거 할려는 것이 바둑판 배열에서 오른쪽으로 바둑돌이 있으면
가로줄( i )=0을 더하고 세로줄( j )=1을 더하려고 그러거든요.
그렇게 만들 방법좀 알려주실 수 없을까요..
2011/05/14  
Prox dolBTF=dolBF+doli;
dolBTS=dolBS+dolj;
gameb(dolBF, dolBS); <- 이게 아마 gameb(dolBTF, dolBTS);로 바껴야하지 않을까요?ㅎ
2011/05/14  
U_SoRang 본 질문과 관련은 없지만,

[if문] 보다는 [switch 문]으로 하시는게 더 나을듯...

저렇게 되면 else나 그의 맞는 답( 예> dolcnt==5)이 나올때까지 계속 검사해야 하거든요.
2011/05/14  
목탁든교황님 ㄴ 그렇군요... 스위치를 별로 안써서 왠지 불안했거든요 ㅎㅎ
한번 써봐야 되겠네요
2011/05/14  
목탁든교황님 prox님//
앞에 다시
dolBF=dolBTF;
dolBS=dolBTS; 로 바꿔서 괜찮을 듯 싶네여
2011/05/14