Странное поведение оператора "> =" при сравнении двух указателей - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь сравнить числовые значения двух указателей с оператором "> =", но вместо их сравнения он добавляет некоторые случайные значения к первому.

void obj::Loader::calculate_size(const char* start_ptr, const char* end_ptr, atomic_long& v, atomic_long& vt, atomic_long& vn, atomic_long& f) {
    while (start_ptr >= end_ptr) {
        if (*start_ptr == 'v') {
            start_ptr++;
            if (*start_ptr == ' ') {
                v++;
                start_ptr += 27;
            }
            else if (*start_ptr == 't') {
                vt++;
                start_ptr += 18;
            }
            else if (*start_ptr == 'n') {
                vn++;
                start_ptr += 21;
            }
        }
        else if (*start_ptr == 'f') {
            start_ptr++;
            if (*start_ptr == ' ') {
                f += 3;
                start_ptr += 17;
            }
        }
        start_ptr++;
    }
}

Эта функция должна подсчитывать всеэкземпляры этих букв в части отображенного в памяти файла (от «start_ptr» до «end_ptr»).Зная минимальную длину в определенных частях файла, я решил увеличить «start_ptr» более чем на один раз, но, делая это, я не могу полагаться на оператор «! =», Чтобы остановить цикл.

Проблема в том, что "> =" на самом деле не работает, как на целых числах, а просто вылетает.Есть ли альтернативы?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Учитывая, что условие цикла равно start_ptr >= end_ptr, и, учитывая, что тело цикла только когда-либо увеличивается start_ptr, если цикл когда-либо введен, то start_ptr никогда не может стать меньше, чем end_ptr, и поэтому циклбесконечна.Поведение программы не определено.

Было бы довольно нетрадиционным для «начала» быть после конца, поэтому я подозреваю, что это ошибка в логике.

1 голос
/ 20 сентября 2019

Сравнение выглядит неправильно для меня: вместо

while (start_ptr >= end_ptr) {
    // [...]
    start_ptr++;
}

я бы ожидал, что естественное условие будет:

while (start_ptr < end_ptr) {
    // [...]
    start_ptr++;
}

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

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