편집 기록

편집 기록
  • 프로필 dmdsmrmaakqhwlvldqh@gmail.com님의 편집
    날짜2022.11.16

    c언어 반복문과 scanf 에러문제


    제가 c언어로 트리를 1차원 배열로 구현하려고 프로그램을 작성하다가 for문에서 반복이 종료되지 않고 계속해서 scanf를 실행되는 상황이 벌어지고 있습니다.

    제가 올린 코드에서는 논리적 에러가 없어 보이고 문법적 에러는 dev c에서 컴파일을 진행할 시 뜨지 않습니다. 제가 에러지점을 주석으로 처리해서 에러지점을 표시하겠습니다.

    이번 에러는 아마도 버퍼 에러이거나 혹은 컴파일러가 코드 최적화를 진행하던 와중에 문제가 발생한 것 같습니다. 하지만 저도 어디서 어떻게 컴파일러가 코드 최적화를 진행했는지 몰라서 질문 드립니다. 죄송합니다 문제를 풀었습니다. 해결방법은 걍 배열의 크기를 250000에서 300000으로 바꾸어 주고 배열 C와 A를 long long형태로 바꾸어 주는 것이 였습니다.

    #include<stdio.h>
    
    int N[250000];//Node
    
    int C[250000]; //Count
    
    int T[250000]; //Temp
    
    int S[250000]; //Set
    
    
    int E[250000]; //Exist
    
    int A[250000]; //Answer
    
    void Show_N(int (*));
    
    int main(int argc, char **argv){
    
        int n;
        int a;
        int i;
        int event;
        int v1, v2;
        scanf("%d", &n);
        n--;
        a = 0;
        for( ; ; ){
            scanf("%d %d", &v1, &v2);
            if(*(N + v1) != 0){
                event = 0;
                i = 0;
                *(T + i) = v1;
                i++;
                *(T + i) = *(N + v1);
                for( ; ; ){
                    if(event == 0){
                        if(*(N + *(T + i)) != 0){
                            i++;
                            *(T + i) = *(N + *(T + i - 1));
                        }
                        else{
                            event = 1;
                        }
                    }
                    if(event == 1){
                        *(N + *(T + i)) = *(T + i - 1);
                        *(N + *(T + i - 1)) = 0;
                        *(T + i) = 0;
                        i--;
                        if(i == 0){
                            *(T + i) = 0;
                            break;
                        }
                    }
                }
            }
            *(N + v1) = v2;
            a++;
            if(a == n){
                break;
            }
        }
    //  Show_N(N);
    
        int q = 0;
        int s = 0;
        int temp;
        scanf("%d", &q);
        event = 0;
        a = 0;
        for( ; ; ){
            if(event == 0){
                s = 0;
                scanf("%d", &s);
                event = 1;  
            }
            if(event == 1){
                i = 0;
                for( ; ; ){
          /*에러지점 -> 입력값을 복사 붙여 넣기를 하면 입력이 다 되었는데도 for문이 종료돼 
            지 않거나 중간에 입력을 하다가 멈추고 계속 입력을 받도록 됨*/
                    scanf("%d", &*(S + i));
                    *(E + *(S + i)) = 1;            
                    i++;
                    if(i == s){
                        break;
                    }
                }
                event = 2;
            }
            if(event == 2){
                i = 0;
                temp = *(S + i);
                for( ; ; ){
                    if(*(E + *(N + temp))){
                        temp = *(N + temp);
                    }
                    else{
                        *(C + temp) += 1;
                        i++;
                        temp = *(S + i);
                        if(i == s){
                            break;
                        }
                    }
                }
                event = 3;
            }
            if(event == 3){
                i = 0;
                for( ; ; ){
                    *(A + a) += *(C + i) * (*(C + i) - 1) / 2;
                    *(C + i) = 0;
                    *(E + i) = 0;
                    i++;
                    if(i == 250000){
                        break;
                    }
                }
                event = 4;
            }
            if(event == 4){
                a++;
                if(a == q){
                    a = 0;
                    for( ; ; ){
                        printf("%d\n", *(A + a));
                        a++;
                        if(a == q){
                            break;
                        }
                    }
                    break;
                }
                event = 0;
            }
        }
        return 0;
    }
    
    void Show_N(int (*N)){
    
        int i = 0;
    
        for( ; ; ){
            if(*(N + i) != 0){
                printf("N[%d] = %d\n", i, *(N + i));
            }
            i++;
            if(i == 250000){
                break;
            }
        }
    }
    
  • 프로필 nowp님의 편집
    날짜2022.11.14

    c언어 반복문과 scanf 에러문제


    제가 c언어로 트리를 1차원 배열로 구현하려고 프로그램을 작성하다가 for문에서 반복이 종료되지 않고 계속해서 scanf를 실행되는 상황이 벌어지고 있습니다.

    제가 올린 코드에서는 논리적 에러가 없어 보이고 문법적 에러는 dev c에서 컴파일을 진행할 시 뜨지 않습니다. 제가 에러지점을 주석으로 처리해서 에러지점을 표시하겠습니다.

    이번 에러는 아마도 버퍼 에러이거나 혹은 컴파일러가 코드 최적화를 진행하던 와중에 문제가 발생한 것 같습니다. 하지만 저도 어디서 어떻게 컴파일러가 코드 최적화를 진행했는지 몰라서 질문 드립니다. 저 좀 살려주십시오.

    #include<stdio.h>
    
    int N[250000];//Node
    
    int C[250000]; //Count
    
    int T[250000]; //Temp
    
    int S[250000]; //Set
    
    
    int E[250000]; //Exist
    
    int A[250000]; //Answer
    
    void Show_N(int (*));
    
    int main(int argc, char **argv){
    
        int n;
        int a;
        int i;
        int event;
        int v1, v2;
        scanf("%d", &n);
        n--;
        a = 0;
        for( ; ; ){
            scanf("%d %d", &v1, &v2);
            if(*(N + v1) != 0){
                event = 0;
                i = 0;
                *(T + i) = v1;
                i++;
                *(T + i) = *(N + v1);
                for( ; ; ){
                    if(event == 0){
                        if(*(N + *(T + i)) != 0){
                            i++;
                            *(T + i) = *(N + *(T + i - 1));
                        }
                        else{
                            event = 1;
                        }
                    }
                    if(event == 1){
                        *(N + *(T + i)) = *(T + i - 1);
                        *(N + *(T + i - 1)) = 0;
                        *(T + i) = 0;
                        i--;
                        if(i == 0){
                            *(T + i) = 0;
                            break;
                        }
                    }
                }
            }
            *(N + v1) = v2;
            a++;
            if(a == n){
                break;
            }
        }
    //  Show_N(N);
    
        int q = 0;
        int s = 0;
        int temp;
        scanf("%d", &q);
        event = 0;
        a = 0;
        for( ; ; ){
            if(event == 0){
                s = 0;
                scanf("%d", &s);
                event = 1;  
            }
            if(event == 1){
                i = 0;
                for( ; ; ){
          /*에러지점 -> 입력값을 복사 붙여 넣기를 하면 입력이 다 되었는데도 for문이 종료돼 
            지 않거나 중간에 입력을 하다가 멈추고 계속 입력을 받도록 됨*/
                    scanf("%d", &*(S + i));
                    *(E + *(S + i)) = 1;            
                    i++;
                    if(i == s){
                        break;
                    }
                }
                event = 2;
            }
            if(event == 2){
                i = 0;
                temp = *(S + i);
                for( ; ; ){
                    if(*(E + *(N + temp))){
                        temp = *(N + temp);
                    }
                    else{
                        *(C + temp) += 1;
                        i++;
                        temp = *(S + i);
                        if(i == s){
                            break;
                        }
                    }
                }
                event = 3;
            }
            if(event == 3){
                i = 0;
                for( ; ; ){
                    *(A + a) += *(C + i) * (*(C + i) - 1) / 2;
                    *(C + i) = 0;
                    *(E + i) = 0;
                    i++;
                    if(i == 250000){
                        break;
                    }
                }
                event = 4;
            }
            if(event == 4){
                a++;
                if(a == q){
                    a = 0;
                    for( ; ; ){
                        printf("%d\n", *(A + a));
                        a++;
                        if(a == q){
                            break;
                        }
                    }
                    break;
                }
                event = 0;
            }
        }
        return 0;
    }
    
    void Show_N(int (*N)){
    
        int i = 0;
    
        for( ; ; ){
            if(*(N + i) != 0){
                printf("N[%d] = %d\n", i, *(N + i));
            }
            i++;
            if(i == 250000){
                break;
            }
        }
    }
    
  • 프로필 dmdsmrmaakqhwlvldqh@gmail.com님의 편집
    날짜2022.11.13

    c언어 반복문과 scanf 에러문제


    제가 c언어로 트리를 1차원 배열로 구현하려고 프로그램을 작성하다가 for문에서 반복이 종료되지 않고 계속해서 scanf를 실행되는 상황이 벌어지고 있습니다. 제가 올린 코드에서는 논리적 에러가 없어 보이고 문법적 에러는 dev c에서 컴파일을 진행할 시 뜨지 않습니다. 제가 에러지점을 주석으로 처리해서 에러지점을 표시하겠습니다. 이번 에러는 아마도 버퍼 에러이거나 혹은 컴파일러가 코드 최적화를 진행하던 와중에 문제가 발생한 것 같습니다. 하지만 저도 어디서 어떻게 컴파일러가 코드 최적화를 진행했는지 몰라서 질문 드립니다. include 스탠더드인풋아웃풋입니다. 저 좀 살려주십시오. '''

    include

    int N[250000];//Node

    int C[250000]; //Count

    int T[250000]; //Temp

    int S[250000]; //Set

    int E[250000]; //Exist

    int A[250000]; //Answer

    void Show_N(int (*));

    int main(int argc, char **argv){

    int n;
    int a;
    int i;
    int event;
    int v1, v2;
    scanf("%d", &n);
    n--;
    a = 0;
    for( ; ; ){
        scanf("%d %d", &v1, &v2);
        if(*(N + v1) != 0){
            event = 0;
            i = 0;
            *(T + i) = v1;
            i++;
            *(T + i) = *(N + v1);
            for( ; ; ){
                if(event == 0){
                    if(*(N + *(T + i)) != 0){
                        i++;
                        *(T + i) = *(N + *(T + i - 1));
                    }
                    else{
                        event = 1;
                    }
                }
                if(event == 1){
                    *(N + *(T + i)) = *(T + i - 1);
                    *(N + *(T + i - 1)) = 0;
                    *(T + i) = 0;
                    i--;
                    if(i == 0){
                        *(T + i) = 0;
                        break;
                    }
                }
            }
        }
        *(N + v1) = v2;
        a++;
        if(a == n){
            break;
        }
    }
    

    // Show_N(N);

    int q = 0;
    int s = 0;
    int temp;
    scanf("%d", &q);
    event = 0;
    a = 0;
    for( ; ; ){
        if(event == 0){
            s = 0;
            scanf("%d", &s);
            event = 1;  
        }
        if(event == 1){
            i = 0;
            for( ; ; ){
                                /*에러지점 -> 입력값을 복사 붙여 넣기를 하면 입력이 다 되었는데도 for문이 종료돼 
                               지 않거나 중간에 입력을 하다가 멈추고 계속 입력을 받도록 됨*/
                scanf("%d", &*(S + i));
                *(E + *(S + i)) = 1;            
                i++;
                if(i == s){
                    break;
                }
            }
            event = 2;
        }
        if(event == 2){
            i = 0;
            temp = *(S + i);
            for( ; ; ){
                if(*(E + *(N + temp))){
                    temp = *(N + temp);
                }
                else{
                    *(C + temp) += 1;
                    i++;
                    temp = *(S + i);
                    if(i == s){
                        break;
                    }
                }
            }
            event = 3;
        }
        if(event == 3){
            i = 0;
            for( ; ; ){
                *(A + a) += *(C + i) * (*(C + i) - 1) / 2;
                *(C + i) = 0;
                *(E + i) = 0;
                i++;
                if(i == 250000){
                    break;
                }
            }
            event = 4;
        }
        if(event == 4){
            a++;
            if(a == q){
                a = 0;
                for( ; ; ){
                    printf("%d\n", *(A + a));
                    a++;
                    if(a == q){
                        break;
                    }
                }
                break;
            }
            event = 0;
        }
    }
    return 0;
    

    }

    void Show_N(int (*N)){

    int i = 0;
    
    for( ; ; ){
        if(*(N + i) != 0){
            printf("N[%d] = %d\n", i, *(N + i));
        }
        i++;
        if(i == 250000){
            break;
        }
    }
    

    } '''