Russian Qt Forum
Апрель 29, 2024, 01:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Почему не работает оператор сравнения != в QByteArray  (Прочитано 12842 раз)
VVN
Чайник
*
Offline Offline

Сообщений: 52


Просмотр профиля
« : Октябрь 03, 2011, 18:42 »

Здравствуйте.

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

Код:
class xxx{
QByteArray title;
}

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

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

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

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

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



« Последнее редактирование: Октябрь 03, 2011, 18:50 от VVN » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 03, 2011, 19:29 »

А так ?

Код
C++ (Qt)
if (title == QString("*.mvt"))
...
 
Записан
VVN
Чайник
*
Offline Offline

Сообщений: 52


Просмотр профиля
« Ответ #2 : Октябрь 03, 2011, 20:16 »

А так ?

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

Опа... так работает, но ведь есть же перегруженные операторы для QByteArray.
Странно однако.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 03, 2011, 20:48 »

А так?

Код
C++ (Qt)
char title[128];
strcpy(title, "*.mvt");
if (title == "*.mvt")
..
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Октябрь 03, 2011, 21:11 »

А так ?

Код
C++ (Qt)
if (title == QLatin1String("*.mvt"))
...
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #5 : Октябрь 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
 
 
Записан
shirushizo
Гость
« Ответ #6 : Октябрь 03, 2011, 21:33 »

Кодировка? Шокированный
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 03, 2011, 21:41 »

Кодировка? Шокированный
"Ну Вы, блин, даете"  Улыбающийся
Записан
VVN
Чайник
*
Offline Offline

Сообщений: 52


Просмотр профиля
« Ответ #8 : Октябрь 03, 2011, 22:37 »

А так?

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

Разве это будет работать?
Записан
VVN
Чайник
*
Offline Offline

Сообщений: 52


Просмотр профиля
« Ответ #9 : Октябрь 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 не предназначен для работы со строкоми.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Октябрь 03, 2011, 22:47 »

Значит из потока еще что-то приходит.
Что возвращает buf.size ()?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Октябрь 04, 2011, 05:41 »

Разве это будет работать?
Вам прозрачно намекают что при сравнении (const char *) будут сравниваться адреса, поэтому != может вернуть true хотя сами строки (т.е. на что указывают адреса) равны. Вы попадаете на такое сравнение если правый аргумент (с чем сравнивается) определен как (const char *) - значит левый также приводится  к (const char *), такой оператор имеется.

В остроумном примере BRE все то же самое, просто QByteArray (пока) еще не распределил свой массив char, а сослался на поданный в конструкторе (разумно, а вдруг его будут только константно читать). Поскольку линкер слил 2 одинаковых строки ".mvt", то адреса будут равны (до первой записи в  QByteArray).

Вот до чего доводит увлечение классами  Улыбающийся
Записан
BRE
Гость
« Ответ #12 : Октябрь 04, 2011, 07:53 »

Вы попадаете на такое сравнение если правый аргумент (с чем сравнивается) определен как (const char *) - значит левый также приводится  к (const char *), такой оператор имеется.
Что это за глупости? Какие приведения, есть готовый оператор для такого сравнения.

Вот до чего доводит увлечение классами  Улыбающийся
Вот до чего доводит незнание используемого инструмента и неумение читать документацию. Подмигивающий

В остроумном примере BRE все то же самое, просто QByteArray (пока) еще не распределил свой массив char, а сослался на поданный в конструкторе (разумно, а вдруг его будут только константно читать). Поскольку линкер слил 2 одинаковых строки ".mvt", то адреса будут равны (до первой записи в  QByteArray).
На самом деле этот остроумный пример показывает наличие у QByteArray оператора:
bool operator==(const QByteArray &a1, const char *a2)
и то что он работает (по крайней мере у меня). Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Октябрь 04, 2011, 08:20 »

На самом деле этот остроумный пример показывает наличие у QByteArray оператора:
bool operator==(const QByteArray &a1, const char *a2)
и то что он работает (по крайней мере у меня). Улыбающийся
Прошу показать где такой (скриншот букваря прилагаю  Улыбающийся)
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #14 : Октябрь 04, 2011, 08:25 »

Прошу показать где такой (скриншот букваря прилагаю  Улыбающийся)
Related Non-Members

bool   operator== ( const char * a1, const QByteArray & a2 )
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.17 секунд. Запросов: 22.