2011-09-27 3 views
0
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 является местным для этой функцииПомогите с логикой C++?

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

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

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

+1

Я думаю, что у вас есть бродячая фигурная фигурная скобка где-то там –

+2

Вы на самом деле не сказали, чего ожидаете от кода ... – Neil

+1

И я уверен, что он не компилируется. – littleadv

ответ

4
(((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++; 
} 
+0

Это для механизма входа. кто-то вводит текст, а затем - нулевой указатель. больше текстового указателя. etc и т. д. до double null, где больше нет доступных записей. Цикл while проверяет, действительно ли значение указателя true (любое число, но ноль) или значение после того, как оно истинно или (любое число, но ноль), а ptr не может быть больше размера буфера – Questioneer

2

Этот бит выглядит подозрительно ко мне:

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

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

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

1

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

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++); 

если obiviously не приходилось, что при наличии BUFSIZE равного размера буфера минус один.

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