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

  • sjc1117
    sjc1117

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

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #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;
    }
    

    10년 전
5개의 댓글이 있습니다.
  • VOCList
    VOCList

    1
    5 1
    1 3
    3 4
    3 5
    T 3

    죽네요


    10년 전 link
  • sjc1117
    sjc1117

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


    10년 전 link
  • VOCList
    VOCList

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


    10년 전 link
  • VOCList
    VOCList

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

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


    10년 전 link
  • sjc1117
    sjc1117

    우와 감사합니다


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