백년전쟁문제 probably assertion fail이 뜹니다

  • User Avatar
    sjc1117

    probably assertion fail이 뜨네요 찾아보니 realloc에서 뜹니다.
    비쥬얼스튜디오에서는 문제없이 돌아가는데 왜 이런거죠
    ~~~ c++
    #include
    #include
    #include

    #define FRANCE 1
    #define ENGLAND 2

    typedef struct _gui{
    short id;
    short contry;
    struct _gui** sub;
    bool revolt;
    int subcnt;

    _gui(short _id){
        id = _id;
        revolt = false;
        sub = (struct _gui**)malloc(sizeof(struct _gui*)*1);
        if(id==1) contry=FRANCE;
        if(id==2) contry=ENGLAND;
        subcnt=0;
    }
    
    
    void setSub(struct _gui* _sub){     
        sub[0] = _sub;
        sub[0]->contry = contry;
        realloc(sub, sizeof(struct _gui*) * (++subcnt));
    }
    
    
    void ChangeContry(int _contry){
        contry =  _contry;
        if(subcnt > 0 ){
            for(int i=0; i<subcnt; i++){
                if(!(sub[i]->revolt)){
                    sub[i]->ChangeContry(contry);
                }else if(sub[i]->revolt){
                    sub[i]->ChangeContry(contry == FRANCE ? ENGLAND : FRANCE);
                }
            }
        }
    }
    
    
    void Uprising(){
        if(revolt){
            revolt = false;
        }else{
            revolt = true;
        }
    
        ChangeContry(contry == FRANCE ? ENGLAND : FRANCE);
    }
    

    }gui;

    int main()
    {
    int input;
    char A[50001][6];
    gui* G[50001];
    int Gnum, QTnum;
    int G1, G2;
    char QT;
    int cnt=0;

    scanf("%d", &input);
    
    for(int i=0; i<input; i++){
        cnt=0;
        scanf("%d %d", &Gnum, &QTnum);
    
        for(int j=1; j<=Gnum; j++){
            G[j] = new gui(j);
        }
    
        for(int j=0; j<Gnum-2; j++){
            scanf("%d %d%*c",  &G1, &G2);
            G[G1]->setSub(G[G2]);
        }
    
        for(int j=0; j<QTnum; j++){
            scanf("%c ", &QT);
            if(QT=='Q'){
                scanf("%d %d%*c", &G1, &G2);
    
                if(G[G1]->contry == G[G2]->contry)  strcpy(A[cnt++], "Ally");
                else strcpy(A[cnt++], "Enemy");
            }else if(QT=='T'){
                scanf("%d%*c", &G1);
                G[G1]->Uprising();
            }
    
        }
        for(int k=0; k<cnt; k++){
            printf("%s\n", A[k]);
        }
    }
    
    
    
    for(int j=1; j<= Gnum; j++){
        delete G[j];
    }
    
    return 0;
    

    }
    ~~~


    12년 전
5개의 댓글이 있습니다.
  • User Avatar
    VOCList

    1
    5 1
    1 3
    3 4
    3 5
    T 3

    죽네요


    12년 전 link
  • User Avatar
    sjc1117

    네 setSub부분에 sub[0]으로 해놓아서 죽을겁니다.
    sub[subcnt]로 바꾸면 제대로 동작하구요
    테스트한다고 저렇게 바꿧는데 제가 원래대로 안하고 올렸네요


    12년 전 link
  • User Avatar
    VOCList

    50000, 50000 랜덤케이스에서 여전히 그냥 죽네요.


    12년 전 link
  • User Avatar
    VOCList

    realloc 사용법이 잘못됐고, realloc 시 재배정하는 사이즈도 의도했던 것 보다 1 작아보입니다.
    그와는 별도로 id를 short로 받으면 5만개짜리 데이터에선 오버플로우가 나겠죠.

    코드 제일 마지막에 delete 하는 부분도 의도하신 위치에서 돌아가지 않아보이네요..


    12년 전 link
  • User Avatar
    sjc1117

    우와 감사합니다


    12년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.