2014-10-23 4 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; 
} 

Проблема заключается в том, что если я ставлю входное число больше или равно 1024, двоичное число будет неправильно. Поэтому с помощью инструмента отладки я обнаружил, что проблема заключается в переменной n, точно в инструкции n=n/2.

Если вы указали номер 1024 в качестве входного номера, n=n/2 работает нормально, пока программа не достигнет 4 значения n, и для этого значения инструкция n=n/2 не работает, и значение 0 равняется n.

Так что я застрял здесь, и я не знаю, в чем проблема.

+1

'int i = 0; int vettore [i]; 'Это объявит пустой массив. (Что, кстати, незаконно) Я думаю, вы хотели 'int vettore [32]' или что-то ... – leemes

+0

насколько велика 'vettore'? в настоящее время он не содержит элементов – sp2danny

+0

Минимальный тестовый пример. –

ответ

1

Не прошел весь код. Но вы объявили int i=0 и int vettore[i]; А внутри while цикл Increasement i и модификация vettore[i] что опасное и вредоносное. (EDIT)

Вы можете попробовать что-то вроде этого.

int vettore[i]; --->int vettore[100]; // just to work in some cases binary upto length of 100 bits

+0

Я знаю, это может быть опасно и неправильно, но я все еще новичок, и у меня нет знаний, чтобы сделать это безопаснее, потому что я еще не знаю возможных проблем, которые могут появиться, если i инициализирует переменную таким образом – Luca

+0

@Luca. Без проблем :). почему я сказал, что это опасно, потому что вы только объявляли массив размером один. И попытаться изменить содержимое последующего места памяти, которое вы не должны изменять. –

+0

Нет ничего особо опасного в изменении значения 'i' после определения' int vettore [i]; '.Длина 'vettore' устанавливается, когда она определена. Изменение 'i' позже не влияет на него. Что опасно, так это определение массива нулевой длины (переменной длины или нет) и попытка изменить его (несуществующие) элементы. –

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

vettore является массивом переменной длины. Его длина определяется, когда она определена. Изменение значения i позже не влияет на vettore.

Массив нулевой длины недействителен, но для VLA он не может (обязательно) быть диаговым во время компиляции. Поскольку vettore не имеет элементов, попытка присвоить значение любому элементу, вероятно, будет clobber других переменных.

0

Большое спасибо, ребята, я сделал предложенные изменения, и все работает отлично! Единственное, что мне нужно было сделать, это инициализировать до 0 переменную i и до 100 вектора!

+0

Помните, что массив размером '100' может хранить до 100 бит. –

Смежные вопросы