Помогите с логикой с ++? - PullRequest
       5

Помогите с логикой с ++?

0 голосов
/ 28 сентября 2011
Something::methodname()
{  
    (unsigned char*) ptr = (unsigned char*) m_pptr;

    while ((*ptr || *(ptr+1)) && (((unsigned char*)m_pptr+BUFSIZE)<ptr))
        ptr++;

    if(ptr == m_pptr)
        return ptr; 

    return ptr + 1;
}

m_pptr является защищенным членом класса.ptr локально для этой функции

Может ли кто-нибудь помочь мне с логикой этого кода?Я знаю, что это компилируется, но ответы, которые я получаю, не те, которые я ожидаю.Я запоминаю буфер, заполненный A5, и цикл while как-то не работает.Это пропускает прямо мимо этого.Любая помощь будет отличной.

Это будет проходить через буфер, и если значение указателя или значение (ptr+1) истинно, оно будет увеличивать указатель И И ptr не может превышать размер буфера (который определяетсяm_pptr «указатель на начало буфера» + размер буфера) также должен быть истинным.Оператор if говорит, что если m_pptr (указатель на начало буфера совпадает с ptr, то возвращает только указатель.

эта функция возвращает void* и ничего не передается

Ответы [ 3 ]

4 голосов
/ 28 сентября 2011
 (((unsigned char*)m_pptr+BUFSIZE)<ptr))

оглядывается назад:

 (((unsigned char*)m_pptr+BUFSIZE)>ptr))

будет более вероятным;Еще более вменяемый:

while (ptr < ((unsigned char*) m_pptr + BUFSIZE)) // until end of buffer
{
    if (!*ptr)      // null char reached
        break;
    if (!*(ptr+1))  // null char almost reached
        break;

    // do stuff

    ptr++;
}
2 голосов
/ 28 сентября 2011

Этот бит мне кажется подозрительным:

 while ((*ptr || *(ptr+1))

Представьте, что ptr указывает на действительный символьный байт, за которым следует байт-терминатор NUL.

Первый суб-тестПриведенная выше строка будет иметь значение true, поэтому ptr будет увеличиваться.Теперь ptr указывает на байт терминатора NUL, а * (ptr + 1) указывает на байт ПОСЛЕ байта терминатора NUL ... который может быть мусором / неопределенным и, следовательно, может быть ненулевым, в какой точке (ptr) будет снова увеличен (потому что второй под-тест оценивается как true на этот раз), так что теперь ptr указывает на байт ПОСЛЕ байта терминатора NUL.И оттуда ваш указатель направляется в la-la-land, пытаясь интерпретировать данные, которые никогда не должны были быть частью строки, которую они анализировали.

1 голос
/ 28 сентября 2011

Разве это не выглядело бы чище и проще, если бы вместо этого вы использовали цикл for?

for ( int i =0; i<BUFSIZE && (ptr[i] || ptr[i+1]); i++);

Было бы легче заметить неправильное сравнение, не так ли? И я думаю, что было бы также легче увидеть, что в этом случае это должно быть

for ( int i =0; i<(BUFSIZE-1) && (ptr[i] || ptr[i+1]); i++);

или даже

for ( int i =1; i<BUFSIZE && (ptr[i-1] || ptr[i]); i++);

, если только вы не объяснили это тем, что BUFSIZE равен размеру буфера минус один.

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