Название: Почему не работает оператор сравнения != в QByteArray Отправлено: VVN от Октябрь 03, 2011, 18:42 Здравствуйте.
В заголовке класса сделано объявление Код: class xxx{ Читаю в эту переменную из файла (потока) строку. потом сравниваю Код: if(title != "*.mvt") Смотрю отладчиком В title как и положено лежит "*.mvt" с завершающим нулем, а if дает истину. Если сделать вот так то ложно. Код: if(title == "*.mvt") Конечно тут все решаемо другим способом. Но интересно что я делаю не так? Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: Igors от Октябрь 03, 2011, 19:29 А так ?
Код
Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: VVN от Октябрь 03, 2011, 20:16 А так ? Код
Опа... так работает, но ведь есть же перегруженные операторы для QByteArray. Странно однако. Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: Igors от Октябрь 03, 2011, 20:48 А так?
Код
Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: Пантер от Октябрь 03, 2011, 21:11 А так ?
Код
Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: BRE от Октябрь 03, 2011, 21:30 Код
Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: shirushizo от Октябрь 03, 2011, 21:33 Кодировка? :o
Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: Igors от Октябрь 03, 2011, 21:41 Кодировка? :o "Ну Вы, блин, даете" :)Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: VVN от Октябрь 03, 2011, 22:37 А так? Код
Разве это будет работать? Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: VVN от Октябрь 03, 2011, 22:44 Код
Вот так все работает. Если объявить в заголовке класса QByteArray buf Потом где то в программе присвоить (в моем случе прочитать из потока) значение, то не хочет работать. При объявлении в заголовке, отладчиком четко видно, что buf создается с запасом где то 32 байта. Когда объявляем локально QByteArray buf то имеем четкое количество байт под строку. Может в этом дело, но ведь там же есть завершающий 0. Тогда можно предположить, что QByteArray не предназначен для работы со строкоми. Название: Re: Почему не работает оператор сравнения != в QByt Отправлено: Пантер от Октябрь 03, 2011, 22:47 Значит из потока еще что-то приходит.
Что возвращает buf.size ()? Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: Igors от Октябрь 04, 2011, 05:41 Разве это будет работать? Вам прозрачно намекают что при сравнении (const char *) будут сравниваться адреса, поэтому != может вернуть true хотя сами строки (т.е. на что указывают адреса) равны. Вы попадаете на такое сравнение если правый аргумент (с чем сравнивается) определен как (const char *) - значит левый также приводится к (const char *), такой оператор имеется.В остроумном примере BRE все то же самое, просто QByteArray (пока) еще не распределил свой массив char, а сослался на поданный в конструкторе (разумно, а вдруг его будут только константно читать). Поскольку линкер слил 2 одинаковых строки ".mvt", то адреса будут равны (до первой записи в QByteArray). Вот до чего доводит увлечение классами :) Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: BRE от Октябрь 04, 2011, 07:53 Вы попадаете на такое сравнение если правый аргумент (с чем сравнивается) определен как (const char *) - значит левый также приводится к (const char *), такой оператор имеется. Что это за глупости? Какие приведения, есть готовый оператор для такого сравнения.Вот до чего доводит увлечение классами :) Вот до чего доводит незнание используемого инструмента и неумение читать документацию. ;)В остроумном примере BRE все то же самое, просто QByteArray (пока) еще не распределил свой массив char, а сослался на поданный в конструкторе (разумно, а вдруг его будут только константно читать). Поскольку линкер слил 2 одинаковых строки ".mvt", то адреса будут равны (до первой записи в QByteArray). На самом деле этот остроумный пример показывает наличие у QByteArray оператора:bool operator==(const QByteArray &a1, const char *a2) и то что он работает (по крайней мере у меня). :) Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: Igors от Октябрь 04, 2011, 08:20 На самом деле этот остроумный пример показывает наличие у QByteArray оператора: Прошу показать где такой (скриншот букваря прилагаю :))bool operator==(const QByteArray &a1, const char *a2) и то что он работает (по крайней мере у меня). :) Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: LisandreL от Октябрь 04, 2011, 08:25 Прошу показать где такой (скриншот букваря прилагаю :)) Related Non-Members… bool operator== ( const char * a1, const QByteArray & a2 ) Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: BRE от Октябрь 04, 2011, 08:25 Чуть ниже. ;)
Название: Re: Почему не работает оператор сравнения != в QByteArray Отправлено: Igors от Октябрь 04, 2011, 08:54 Чуть ниже. ;) Точно, это я недосмотрел :) И у меня работает "как доктор прописал", вызывает qstrcmpТогда топикстартеру отладчиком надо смотреть Название: Re: Почему не работает оператор сравнения != в QByt Отправлено: VVN от Октябрь 04, 2011, 19:50 Значит из потока еще что-то приходит. Что возвращает buf.size ()? Спасибо всем за ответы. buf.size(0) возвращает 35. Я не правильно читал из потока. Почему то мне подумалось что сравнение должно работать до завещающего нуля (по аналогии с функциями сравнения С), но в QByteArray это не так. Так что там все правильно работает. У меня немного другой вопрос каким методом (оператором) можно прочить из потока строку с завещающим "\0" а не "\n" Перепробовал все read и операторы >>, не хотят они до нуля читать. Пришлось свою функцию написать с чтением побайтно и проверкой на 0 |