Qt 4.3.0

Aug 25, 2007 02:01

И кто бы мог подумать?inline bool operator<(const QByteArray &a1, const QByteArray &a2)
{ return strcmp(a1, a2) < 0; }

inline bool operator==(const QByteArray &a1, const QByteArray &a2)
{ return (a1.size () == a2.size()) && (memcmp(a1, a2, a1.size())==0); }( Read more... )

Leave a comment

Comments 2

einwill August 25 2007, 04:51:55 UTC
Забавно :)

Чего-то... на глаз ошибку и не видно. Ну-у-у... разве что Char объявлен как wide, тогда м.б. такой эффект можно достичь?.. Хм.

Но под отладчиком-то ошибка должна быстро находиться, я полагаю... Ы?

Reply

virkony August 25 2007, 07:55:04 UTC
:) ошибка была найдена после того как можно сказать QMap при find'е возвращал итератор с key() не равным тому что искалось и в тоже время не end()'ом

strcmp - сравнивает строки до '\0' символа, соответственно strcmp(QByteArray::fromHex("0007"), QByteArray::fromHex("0018")) == 0
а memcmp - сравнивает как пологается и '\0' в том числе аж до указанного количества, и как результат
соответственно memcmp(QByteArray::fromHex("0007"), QByteArray::fromHex("0018"), 2) != 0
плюс сравнение размеров.

Вообщем кучу времени потратил пока дошло, а дебаггером не пользовался да и не помогло бы. Сразу было видно, что либо я где-то не очень хорошо юзаю QByteArray, что данные меняются когда они уже в QMap'е как ключ (в Qt же большинство контейнеров используют ссылки на данные и copy-on-write), либо же где-то закрался QByteArray::fromRawData на данные которые меняются со временем.

Reply


Leave a comment

Up