С ++ сбой при увеличении беззнакового long int - PullRequest
0 голосов
/ 18 марта 2011

Это город ВТФ.

Приведенная ниже программа дает сбой после нескольких тысяч циклов.

unsigned long int nTurn = 1;
bool quit = false;

int main(){
    while(!quit){
        doTurn();
        ++nTurn;
    }
}

Это, конечно, упрощенно из моей игры, но nTurn в данный момент используется нигде , но его приращение, и когда я закомментирую строку ++ nTurn, программа надежно зациклится навсегда , Разве это не должно доходить до миллионов?

WTF, stackoverflow?

Ответы [ 4 ]

6 голосов
/ 18 марта 2011

Ваша проблема в другом месте.

Некоторая другая часть программы читает из дикого указателя, который в конечном итоге указывает на nTurn, и когда этот цикл изменяет значение, другой код действует иначе. Или есть условие гонки, и приращение заставляет этот цикл занимать чуть-чуть дольше, чтобы гонка не вызывала проблем. Есть бесконечное множество вещей, которые вы могли бы ошибаться в другом месте.

Можете ли вы запустить свою программу под valgrind? Некоторых ошибок он не найдет, но много найдет.

0 голосов
/ 18 марта 2011

++ nTurn не может быть источником сбоя напрямую. У вас может быть какое-то переполнение буфера, в результате чего арифметика указателя обращается к памяти для переменной nTurn, когда это не должно быть. Это может вызвать странное поведение в сочетании с увеличением.

0 голосов
/ 18 марта 2011

Я бы использовал отладчик, чтобы поймать ошибку и посмотреть значение nTurn. Или, если у вас есть дамп ядра после сбоя, загрузите его в отладчик, чтобы увидеть значения var во время сбоя.

Еще один вопрос, может ли проблема заключаться в том, что nTurn оборачивается и стремится к нулю?

0 голосов
/ 18 марта 2011

может показаться глупым, но, если бы я посмотрел на это, я бы, возможно, вывел nTurn-переменную и посмотрел, всегда ли она вылетает на значении. затем, возможно, инициализировать nTurn к этому и посмотреть, если это также вызывает это. Вы всегда можете поместить это в отладку и посмотреть, что происходит с различными регистрами и так далее. Вы пробовали разные компиляторы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...