2014-10-23 6 views
0

입력에 주어진 십진수의 이진수를 계산하는 C 프로그램을 작성했지만 입력에 제공된 수를 유지하는 데 사용 된 변수로 인한 큰 문제가 있습니다.int 변수의 이상한 동작

int main() { 
    // variables declaration 
    int n,a,i=0; 
    int vector[i]; 
    float rest; 
    // acquisition of the input number 
    printf("enter an integer:..."); 
    scanf("%d",&n); 
    while(n>0) { 
     // calculation and comparison of the data acquired to obtain the binary output 
     rest=n%2; 
     if (rest!= 0) { 
      vector[i]=1; 
     } 
     else if (rest== 0) { 
      vector[i]=0; 
     } 
     n=n/2; 
     i++; 
    } 
    // representation of the binary value calculated 
    printf("the binary value of the number entered is: "); 
    for(a=i-1;a>=0;a--) { 
     printf("%d",vector[a]); 
    } 


    return 0; 
} 

문제는 I 1024에 입력 한 숫자 크거나 같은 넣을 경우, 이진수가 잘못 될 것입니다 :

이 내 코드입니다. 따라서 디버그 도구를 사용하면 문제가 n 변수에 있음을 알게되었습니다. 정확히 n=n/2 명령에 있습니다.

입력 번호로 1024를 입력하면 n=n/2은 프로그램이 4 값 n에 도달 할 때까지 작동하며 그 값은 n=n/2 명령이 작동하지 않고 n에 0 값을 부여합니다.

그래서 여기에 붙어서 어떤 종류의 문제인지 몰라요.

+1

'int i = 0; int vettore [i];'빈 배열을 선언합니다. (그건 그렇고 불법입니다) 당신이'int vettore [32]'또는 뭔가를 원했던 것 같아요. – leemes

+0

'vettore '가 얼마나 큰가요? 현재 요소가 없습니다. – sp2danny

+0

최소 테스트 케이스. –

답변

1

전체 코드를 검토하지 않았습니다. 하지만 int i=0int vettore[i];을 선언했으나 while 루프에서는 i을 증가시키고 vettore[i]을 수정하는 것은 위험하고 잘못되었습니다. (EDIT)

다음과 같이 시도해 볼 수 있습니다. int vettore[100]; // just to work in some cases binary upto length of 100 bits

+0

나는 이것이 위험하고 잘못 될 수는 있겠지만 아직 초보자이며 더 안전하게이 작업을 수행 할 수있는 지식이 없다는 것을 알고 있습니다. 이 방법으로 변수를 초기화합니다. – Luca

+0

@ 루카. 문제 없어 :). 왜 내가 위험하다고 말했습니까? 왜냐하면 당신이 단지 하나의 배열을 선언했기 때문입니다. 그리고 그것의 내용을 수정하려고하면 수정해서는 안되는 후속 메모리 위치가됩니다. –

+0

'int vettore [i];'를 정의한 후에'i'의 값을 변경하는 데 특별히 위험한 것은 없습니다.'vettore'의 길이는 그것이 정의 될 때 설정됩니다. 'i'를 나중에 변경해도 효과가 없습니다. 위험한 것은 길이가 0 인 배열 (가변 길이 여부)을 정의하고 그 (존재하지 않는) 요소를 수정하려고 시도하는 것입니다. –

3
int n,a,i=0; 
int vettore[i]; 

vettore

int vettore[i]; --->는 가변 길이 배열이다. 길이가 정의되면 결정됩니다. i 값을 변경해도 vettore에는 아무런 영향을 미치지 않습니다.

길이가 0 인 배열은 유효하지 않지만 VLA의 경우 길이가 컴파일 될 때 (반드시) 해석 할 수 없습니다. vettore에는 요소가 없기 때문에 요소에 값을 할당하려고하면 다른 변수가 손상 될 수 있습니다.

0

정말 고맙습니다. 제안 된 변경 사항을 수행했으며 모든 것이 잘 작동합니다! 필요한 것은 변수 i를 0으로 초기화하고 벡터를 100으로 초기화하는 것뿐이었습니다!

+0

치수 '100'의 배열은 '100'비트까지만 저장할 수 있습니다. –