2014-09-09 2 views
-2

Переменная constant_counter инициализируется как постоянное целое число.Неожиданное изменение константного целого C++

cout < < stable_counter;

До тех пор, пока у меня есть вышеуказанное утверждение где-либо перед следующим кодом, функция работает как ожидалось и проверяет, является ли целочисленный ввод или не является обходным числом.

Проблема заключается в том, что, когда строка cout отсутствует, константное целое изменяется в следующих инструкциях if. Я проверил это, напечатав файл stable_counter перед вводом if-else, а затем после if-else.

Без линии cout, constant_counter изменяется на 4-значное число.

for (int i = 0; i < 10; i++) 
    { 
     if (CheckArr[i]) 
     { 
      num_of_unique++; 
     } 
    } 

    if ((steady_counter == num_of_unique) & (final == NumArr[0])) 
    { 
     return true; 
    } 
    else 
    { 

     return false; 
    } 
} 

Любая идея, что происходит? Зачем нужна строка cout для поддержания константы integer stable_counter?

+3

Скомпилируйте все предупреждения и информацию об отладке (например, с помощью 'g ++ -Wall -g'). Затем ** используйте отладчик ** (например, 'gdb'). Узнайте о [неопределенном поведении] (http://en.wikipedia.org/wiki/Undefined_behavior). Читайте больше учебников по C++. –

+1

Это немного беспорядок. Я не понимаю, почему вы решили использовать VLA. Наверное, случайно. Возможно, вы не знаете, что такое VLA, и используете это непреднамеренно. Я не понимаю, почему вы не используете стандартные контейнеры. Вы программируете на C++, а не C. –

+0

@Basile привет! Не могли бы вы рассказать о «предупреждениях и отладочной информации»? Вышеуказанные компилируются без каких-либо ошибок. Должен ли я включить основную функцию с помощью тестового кода? – lostlostlostlostlost

ответ

2

Одна из очевидных проблем:

for (int i = counter; i > 0; i --) 
    NumArr[i] = -1; 

Это охватывает значения от 1 до counter включительно; а действительные индексы для NumArr - от 0 до counter-1 включительно. Таким образом, вы пишете вне массива, развращая что-то другое; возможно, другая локальная переменная.

Либо корректировать ошибку за пределы по одному в индексе

NumArr[i-1] = -1; 

или использовать более каноническую петлю

for (int i = 0; i < counter; ++i) 

или, для более из С ароматом ++,

std::fill(NumArr, NumArr+counter, -1); 

Вероятно, будут дополнительные ошибки, которые лучше обнаруживаются с помощью вашего отладчика, чем попросить людей прочитать gh весь ваш код.

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