Russian Qt Forum

Qt => Вопросы новичков => Тема начата: VVN от Октябрь 03, 2011, 18:42



Название: Почему не работает оператор сравнения != в QByteArray
Отправлено: VVN от Октябрь 03, 2011, 18:42
Здравствуйте.

В заголовке класса сделано объявление

Код:
class xxx{
QByteArray title;
}

Читаю в эту переменную из файла (потока) строку.

потом сравниваю
Код:
 if(title != "*.mvt")
           return;

Смотрю отладчиком В title как и положено лежит "*.mvt" с завершающим нулем,
а  if дает истину.

Если сделать вот так то ложно.
Код:
 if(title == "*.mvt")
           return;

Конечно тут все решаемо другим способом.
Но интересно что я делаю не так?





Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: Igors от Октябрь 03, 2011, 19:29
А так ?

Код
C++ (Qt)
if (title == QString("*.mvt"))
...
 


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: VVN от Октябрь 03, 2011, 20:16
А так ?

Код
C++ (Qt)
if (title == QString("*.mvt"))
...
 

Опа... так работает, но ведь есть же перегруженные операторы для QByteArray.
Странно однако.


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: Igors от Октябрь 03, 2011, 20:48
А так?

Код
C++ (Qt)
char title[128];
strcpy(title, "*.mvt");
if (title == "*.mvt")
..
 


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: Пантер от Октябрь 03, 2011, 21:11
А так ?

Код
C++ (Qt)
if (title == QLatin1String("*.mvt"))
...
 


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: BRE от Октябрь 03, 2011, 21:30
Код
C++ (Qt)
$ cat main.cpp
#include <QByteArray>
#include <QDebug>
 
int main( int, char ** )
{
       QByteArray buf( "*.mvt" );
       qDebug() << "buf == *.mvt ->" << (( buf == "*.mvt" )? "Yes" : "No");
       qDebug() << "buf != *.mvt ->" << (( buf != "*.mvt" )? "Yes" : "No");
       return 0;
}
 
$ ./test
buf == *.mvt -> Yes
buf != *.mvt -> No
 
 


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: shirushizo от Октябрь 03, 2011, 21:33
Кодировка? :o


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: Igors от Октябрь 03, 2011, 21:41
Кодировка? :o
"Ну Вы, блин, даете"  :)


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: VVN от Октябрь 03, 2011, 22:37
А так?

Код
C++ (Qt)
char title[128];
strcpy(title, "*.mvt");
if (title == "*.mvt")
..
 

Разве это будет работать?


Название: Re: Почему не работает оператор сравнения != в QByteArray
Отправлено: VVN от Октябрь 03, 2011, 22:44
Код
C++ (Qt)
$ cat main.cpp
#include <QByteArray>
#include <QDebug>
 
int main( int, char ** )
{
       QByteArray buf( "*.mvt" );
       qDebug() << "buf == *.mvt ->" << (( buf == "*.mvt" )? "Yes" : "No");
       qDebug() << "buf != *.mvt ->" << (( buf != "*.mvt" )? "Yes" : "No");
       return 0;
}
 
$ ./test
buf == *.mvt -> Yes
buf != *.mvt -> No
 
 

Вот так все работает.

Если объявить в заголовке класса 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