Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Июль 04, 2014, 09:58



Название: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 09:58
"Самый строгий" компилятор пропускает это без всяких варнингов и пришлось искать "ну чего ж оно не равно"  ???

Код
C++ (Qt)
char test[10];
test[0] = 0xC3;
if (test[0] == 0xC3) {
..
:)


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 10:01
Видимо дело в 8 битике, который радостно сообщает нам, что число отрицательное.

PS Заведите себе доблестный раздел "вопросы и всякие интересности" :)


Название: Re: signed/unsigned
Отправлено: Hellraiser от Июль 04, 2014, 10:14
В MSVC char по-умолчанию signed. А в данном коде более уместно применить quint8 (хотя это всего лишь typedef, но как-бы намекает...)


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 10:22
И да, с точки зрения компилятора здесь всё правильно :)
Не путайте ваше "человеческое" восприятие и правила компилятора :) Всё в соответствии с преобразованием типов и представлением отрицательных чисел :)

Сам такое ковырял, решил всё с помощью quint8 - самый безболезненный вариант.


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 10:35
"Самый строгий" компилятор пропускает это без всяких варнингов...
Кушаете кактус и периодически приходите на форум показать очередную колючку, впившуюся в язык? :)


Название: Re: signed/unsigned
Отправлено: Fat-Zer от Июль 04, 2014, 11:05
"Самый строгий" компилятор пропускает это без всяких варнингов и пришлось искать "ну чего ж оно не равно"  ???

странный у вас «самый строгий компилятор»...
clang-3.3 выдаёт варнинг по дефолту...
gcc-4.7 c -Wextra выдаёт варнинг на сравнение, а с -pedantic ещё и на присваивание...


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 11:30
Варнинги в компиляторах - это предупреждение программисту. Возможная ошибка. И каждый компилятор может что угодно в них писать.

Igors зачем вы выбрали C++, если вы собственными руками нарушаете правила, а потом кричите, что никто вас не предупредил? :)

Четко описан порядок преобразования, представление отрицательных чисел. С++ тем и славен, что в ногу выстрелить позволяет :D


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 11:37
Конечно, компилятор может вообще ничего не писать, не то что предупреждения, а даже сообщения о ошибках - просто завершаться и все. :)
Но стоит ли таким компилятором пользоваться?


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 11:43
Просто тут столкнулся мой интерес что мои слова
Цитировать
Компилятор MSVC наиболее соответствует стандарту C++98 с поправками от 2003 года
А Igors их тут применяет по поводу
Цитировать
Вай он плохой плохой, предупреждение не пишет

И потому на мой взгляд он несправедлив :) Потому что стандарту он соответствует, а вот то что варнинг не пишет - это уже другая история :)

PS я сам бился с этой проблемой ммм... дня три наверно :D Пытался понять почему то работает, то не работает :D


Название: Re: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 11:47
Варнинги в компиляторах - это предупреждение программисту. Возможная ошибка. И каждый компилятор может что угодно в них писать.
Ваш любимец пишет, мягко говоря, "с избытком". Присвоил флоту дабл - ой/ай, смотрите, точность теряется!! (типа я не знал). Что ж он, падла, реальные/явные ошибки не ловит?

PS я сам бился с этой проблемой ммм... дня три наверно :D
Alt-8. там все сразу видно


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 12:43
Нажать Alt+8 на контроллере, который находится за несколько сотен км :D
Обязательно попробую :D


Название: Re: signed/unsigned
Отправлено: kambala от Июль 04, 2014, 12:46
понятная картинка в аттаче.

еще можно пользоваться статическим анализатором (например clang, PVS-Studio).


Название: Re: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 14:12
понятная картинка в аттаче.
Ага, ага
Код
Код
C++ (Qt)
#include <QtWidgets>
 
int main( int argc, char **argv )
{
(void) argc;
(void) argv;
char str[10];
str[0] = 0xC3;
bool test = (str[0] == 0xC3);
(void) test;
return 0;
}
 
Выхлоп с /W4
Цитировать
1>------ Build started: Project: Test1, Configuration: Debug Win32 ------
1>  TestMSVC.cpp
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qstring.h(842): warning C4127: conditional expression is constant
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qmetatype.h(777): warning C4512: 'QtMetaTypePrivate::VariantData' : assignment operator could not be generated
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmetatype.h(765) : see declaration of 'QtMetaTypePrivate::VariantData'
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qobject_impl.h(135): warning C4512: 'QtPrivate::QSlotObjectBase' : assignment operator could not be generated
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qobject_impl.h(109) : see declaration of 'QtPrivate::QSlotObjectBase'
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(72): warning C4127: conditional expression is constant
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(81): warning C4127: conditional expression is constant
1>c:\qt\5.2.0\msvc2012\include\qtcore\qstringbuilder.h(149): warning C4512: 'QStringBuilder<QString,QString>' : assignment operator could not be generated
1>          c:\qt\5.2.0\msvc2012\include\qtcore\qstringbuilder.h(139) : see declaration of 'QStringBuilder<QString,QString>'
1>c:\qt\5.2.0\msvc2012\include\qtcore\qstringbuilder.h(162): warning C4512: 'QStringBuilder<QByteArray,QByteArray>' : assignment operator could not be generated
1>          c:\qt\5.2.0\msvc2012\include\qtcore\qstringbuilder.h(152) : see declaration of 'QStringBuilder<QByteArray,QByteArray>'
1>TestMSVC.cpp(6): warning C4309: '=' : truncation of constant value
1>TestMSVC.cpp(3): warning C4100: 'argv' : unreferenced formal parameter
1>TestMSVC.cpp(3): warning C4100: 'argc' : unreferenced formal parameter
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(521): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(511) : while compiling class template member function 'void QList<T>::append(const T &)'
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qstringlist.h(65) : see reference to function template instantiation 'void QList<T>::append(const T &)' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qstringlist.h(62) : see reference to class template instantiation 'QList<T>' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(785): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(774) : while compiling class template member function 'QHash<Key,T>::iterator QHash<Key,T>::insert(const Key &,const T &)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvariant.h(759) : see reference to function template instantiation 'QHash<Key,T>::iterator QHash<Key,T>::insert(const Key &,const T &)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvariant.h(501) : see reference to class template instantiation 'QHash<Key,T>' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(216): warning C4512: 'QHashNode<Key,T>' : assignment operator could not be generated
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(786) : see reference to class template instantiation 'QHashNode<Key,T>' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(226): warning C4512: 'QHashDummyNode<Key,T>' : assignment operator could not be generated
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(602) : see reference to class template instantiation 'QHashDummyNode<Key,T>' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(600) : while compiling class template member function 'void QHash<Key,T>::detach_helper(void)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(322) : see reference to function template instantiation 'void QHash<Key,T>::detach_helper(void)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(266): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(265) : while compiling class template member function 'void QMapNode<Key,T>::destroySubTree(void)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(236) : see reference to function template instantiation 'void QMapNode<Key,T>::destroySubTree(void)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(236) : see reference to class template instantiation 'QMapNode<Key,T>' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(234) : while compiling class template member function 'void QMapData<Key,T>::destroy(void)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(344) : see reference to function template instantiation 'void QMapData<Key,T>::destroy(void)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(333) : see reference to class template instantiation 'QMapData<Key,T>' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(333) : while compiling class template member function 'QMap<Key,T>::QMap(void)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvariant.h(772) : see reference to function template instantiation 'QMap<Key,T>::QMap(void)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvariant.h(501) : see reference to class template instantiation 'QMap<Key,T>' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(268): warning C4127: conditional expression is constant
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qmap.h(270): warning C4127: conditional expression is constant
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(366): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(365) : while compiling class template member function 'void QList<T>::node_construct(QList<T>::Node *,const T &)'
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(515) : see reference to function template instantiation 'void QList<T>::node_construct(QList<T>::Node *,const T &)' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(733) : while compiling class template member function 'QList<T>::QList(const QList<T> &)'
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qstringlist.h(66) : see reference to function template instantiation 'QList<T>::QList(const QList<T> &)' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(367): warning C4127: conditional expression is constant
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(382): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(381) : while compiling class template member function 'void QList<T>::node_destruct(QList<T>::Node *)'
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(535) : see reference to function template instantiation 'void QList<T>::node_destruct(QList<T>::Node *)' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(383): warning C4127: conditional expression is constant
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(390): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(388) : while compiling class template member function 'void QList<T>::node_copy(QList<T>::Node *,QList<T>::Node *,QList<T>::Node *)'
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(741) : see reference to function template instantiation 'void QList<T>::node_copy(QList<T>::Node *,QList<T>::Node *,QList<T>::Node *)' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(403): warning C4127: conditional expression is constant
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(563): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(560) : while compiling class template member function 'QHashNode<Key,T> *QHash<Key,T>::createNode(uint,const Key &,const T &,QHashNode<Key,T> **)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(782) : see reference to function template instantiation 'QHashNode<Key,T> *QHash<Key,T>::createNode(uint,const Key &,const T &,QHashNode<Key,T> **)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(884) : while compiling class template member function 'void QHash<Key,T>::reserve(int)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvariant.h(757) : see reference to function template instantiation 'void QHash<Key,T>::reserve(int)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(550): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(548) : while compiling class template member function 'void QHash<Key,T>::duplicateNode(QHashData::Node *,void *)'
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(603) : see reference to function template instantiation 'void QHash<Key,T>::duplicateNode(QHashData::Node *,void *)' being compiled
1>          with
1>          [
1>              Key=QString,
1>              T=QVariant
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qvector.h(290): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvector.h(289) : while compiling class template member function 'void QVector<T>::destruct(T *,T *)'
1>          with
1>          [
1>              T=QTextLength
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvector.h(452) : see reference to function template instantiation 'void QVector<T>::destruct(T *,T *)' being compiled
1>          with
1>          [
1>              T=QTextLength
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvector.h(451) : while compiling class template member function 'void QVector<T>::freeData(QTypedArrayData<T> *)'
1>          with
1>          [
1>              T=QTextLength
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qvector.h(76) : see reference to function template instantiation 'void QVector<T>::freeData(QTypedArrayData<T> *)' being compiled
1>          with
1>          [
1>              T=QTextLength
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtGui/qtextformat.h(349) : see reference to class template instantiation 'QVector<T>' being compiled
1>          with
1>          [
1>              T=QTextLength
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(216): warning C4512: 'QHashNode<Key,T>' : assignment operator could not be generated
1>          with
1>          [
1>              Key=int,
1>              T=QItemEditorCreatorBase *
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(542) : see reference to class template instantiation 'QHashNode<Key,T>' being compiled
1>          with
1>          [
1>              Key=int,
1>              T=QItemEditorCreatorBase *
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(538) : while compiling class template member function 'void QHash<Key,T>::deleteNode2(QHashData::Node *)'
1>          with
1>          [
1>              Key=int,
1>              T=QItemEditorCreatorBase *
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(589) : see reference to function template instantiation 'void QHash<Key,T>::deleteNode2(QHashData::Node *)' being compiled
1>          with
1>          [
1>              Key=int,
1>              T=QItemEditorCreatorBase *
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(588) : while compiling class template member function 'void QHash<Key,T>::freeData(QHashData *)'
1>          with
1>          [
1>              Key=int,
1>              T=QItemEditorCreatorBase *
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qhash.h(301) : see reference to function template instantiation 'void QHash<Key,T>::freeData(QHashData *)' being compiled
1>          with
1>          [
1>              Key=int,
1>              T=QItemEditorCreatorBase *
1>          ]
1>          c:\qt\5.2.0\msvc2012\include\qtwidgets\qitemeditorfactory.h(112) : see reference to class template instantiation 'QHash<Key,T>' being compiled
1>          with
1>          [
1>              Key=int,
1>              T=QItemEditorCreatorBase *
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(424): warning C4127: conditional expression is constant
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(423) : while compiling class template member function 'void QList<T>::node_destruct(QList<T>::Node *,QList<T>::Node *)'
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(696) : see reference to function template instantiation 'void QList<T>::node_destruct(QList<T>::Node *,QList<T>::Node *)' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(432) : while compiling class template member function 'QList<T> &QList<T>::operator =(const QList<T> &)'
1>          with
1>          [
1>              T=QString
1>          ]
1>          C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(855) : see reference to function template instantiation 'QList<T> &QList<T>::operator =(const QList<T> &)' being compiled
1>          with
1>          [
1>              T=QString
1>          ]
1>C:\Qt\5.2.0\msvc2012\include\QtCore/qlist.h(426): warning C4127: conditional expression is constant
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


Название: Re: signed/unsigned
Отправлено: kambala от Июль 04, 2014, 14:23
Цитировать
TestMSVC.cpp(6): warning C4309: '=' : truncation of constant value
с 3 не выдает этого?

исходный вопрос решен. остальное — «сопутствующий ущерб» :)

edit: вот не поленился и создал проект, включил уровень 2:
Код:
1>main.cpp(8): warning C4309: '=' : truncation of constant value
а тонна ворнингов из Qt посыпалась только с -Wall


Название: Re: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 14:34
Цитировать
TestMSVC.cpp(6): warning C4309: '=' : truncation of constant value
с 3 не выдает этого?

исходный вопрос решен. остальное — «сопутствующий ущерб» :)
Тут один ущерб, это он вякает на предыдущую строку. Поставьте
Код
C++ (Qt)
str[0] = char(0xC3);
- и нема варнингов ни с 2 ни с 3


Название: Re: signed/unsigned
Отправлено: kambala от Июль 04, 2014, 15:04
вставил после объявления строки. теперь да, только с 4 выдает:
Код:
main.cpp(8): warning C4310: cast truncates constant value
без приведения типа выдает C4309 на ту же строку.

вы в Xcode что ли не выполняете Analyze периодически? ;)


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 15:12
offtop: Ппц рассуждения.
1: Я ударил лбом об стену. Голова болит. Почему нет предупреждений?
2: Вот предупреждение c WAll!
1: А я взял и ударился затылком с разбегу, нет предупреждения. Где?
2: А вот тут что!
...

Думаю следующим будет "А я положил стенку и на неё темечком с 4 этажа упал" :D



Название: Re: signed/unsigned
Отправлено: m_ax от Июль 04, 2014, 16:00
offtop: Ппц рассуждения.
1: Я ударил лбом об стену. Голова болит. Почему нет предупреждений?
2: Вот предупреждение c WAll!
1: А я взял и ударился затылком с разбегу, нет предупреждения. Где?
2: А вот тут что!
...

Думаю следующим будет "А я положил стенку и на неё темечком с 4 этажа упал" :D



Нет, не угадали.. Следующий вопрос будет такой:
Почему "самый строгий" компилятор пропускает это (что недопустимо в с++)
/* отрывок из одного шедевра */:

Код
C++ (Qt)
void SBGlass::disableOpacity()
{
   wGlass_->setGraphicsEffect(&QGraphicsOpacityEffect());
}
 

Верес, не узнаёте?


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 16:41
Потому что можно выстрелить себе в ногу согласно стандарту :)
А что не так? :)

PS предлагайте :)


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 16:46
А что не так? :)
Нет предупреждения? :)


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 17:06
Мне и не надо :)
Лично я прекрасно понимаю что объект уничтожится и всё будет хорошо :D Ведь другого способа убрать эффект овродя нет :D


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 17:20
Мне и не надо :)
Конечно, ведь завсегда лучше:
PS я сам бился с этой проблемой ммм... дня три наверно :D Пытался понять почему то работает, то не работает :D

Три то дня всего... :)


Название: Re: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 17:35
// дустовские садисты совсем затюкали мальчонку с перифЕрии  :'(


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 18:55
Три для разбираться в том, что делал впервые - это очень хорошо :D И я этим горжусь :)

Вопрос к Old:
Цитировать
Конечно, ведь завсегда лучше:
- что вы этим имели в виду? Что код плохой? Что присутствует незримая ошибка? Что я делаю что-то неправильно?

Подскажите тогда как правильно и какая у меня ошибка.


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 19:12
Код плохой, но говорим мы про компиляторы.
Плохо то, что компилятор вас не предупредил о не однозначность и молча сделал как ему захотелось. Вы же разбираясь с этим потратили три дня в пустую. Выдай он предупреждение, такого бы не случилось.


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 19:26
Не соглашусь с вами :)
1) Компилятор сделал всё правильно. Эти правила просты и понятны, хоть и есть неоднозначность, но не более того.
Тут виновен именно я.
2) Компилятор не может предупреждать о всём и вся, к сожалению. Точнее может, но это отразится на других его качествах и возможностях. Это неизбежное зло - программист должен понимать, что он делает. Пусть даже в общих чертах.
3) Если бы он выдавал варнинги во всех сомнительных случаях, то я бы просто не нашёл нужный варнинг в "куче" остальных. На ваш взгляд мой код плохой, компилятор бы ругался ещё больше, мб :)

PS а почему код плохой? поправьте уж, чтобы я не выкладывал более такой плохой код :)


Название: Re: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 20:15
Код
C++ (Qt)
char test[10];
test[0] = 0xC3;
if (test[0] == 0xC3) {
..
Вот хоть бы один спросил "ну как же так, почему же переменная не равна только что присвоенному значению?". А ведь ответа так и не прозвучало :)

1) Компилятор сделал всё правильно. Эти правила просты и понятны, хоть и есть неоднозначность, но не более того
Так поведайте нам эти "простые и понятные" правила которые ведут к такому чудесному результату

Тут виновен именно я.
То да - и не только тут  :)




Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 20:19
1) Компилятор сделал всё правильно. Эти правила просты и понятны, хоть и есть неоднозначность, но не более того.
Нельзя быть "чуть-чуть беременной". :)
Либо компилятор все сделал правильно и не однозначность не возникла, либо...

2) Компилятор не может предупреждать о всём и вся, к сожалению. Точнее может, но это отразится на других его качествах и возможностях. Это неизбежное зло - программист должен понимать, что он делает. Пусть даже в общих чертах.
Он должен, просто обязан предупреждать обо всем. О каждой мелочи.
Много крупных проектов собираются с опцией компилятора "предупреждение как ошибка", т.е. их собрать даже нельзя, пока разработчик не исправит не однозначность. Так по мима всех варнингов от компилятора, программисты использует статические анализаторы, которые проверяют код и сыпят своими предупреждениями.

3) Если бы он выдавал варнинги во всех сомнительных случаях, то я бы просто не нашёл нужный варнинг в "куче" остальных.
Так у вас не должно быть столько предупреждений в программе, исправьте их и сможете находить новые. :)

PS а почему код плохой? поправьте уж, чтобы я не выкладывал более такой плохой код :)
В этой теме я не увидел не одной строчки вашего кода. Про что вы меня все время спрашиваете?


Название: Re: signed/unsigned
Отправлено: kambala от Июль 04, 2014, 20:21
Вот хоть бы один спросил "ну как же так, почему же переменная не равна только что присвоенному значению?". А ведь ответа так и не прозвучало :)
будем обсуждать неявные приведения типов? первый операнд — отрицательное число, второй — положительное, вот они и неравны :)


Название: Re: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 20:31
будем обсуждать неявные приведения типов? первый операнд — отрицательное число, второй — положительное, вот они и неравны :)
На мой взгляд такое объяснение поверxностно. Но послушаем Вереса, посвятившего этой проблеме 3 дня


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 20:44
А я уже ответил :) в самом начале. Если не умеете читать, увы.

to Old: извиняюсь, попутал. Выше m_ax выложил кусок кода с SBGlass и именно ему адресовался вопрос :)


Название: Re: signed/unsigned
Отправлено: m_ax от Июль 04, 2014, 20:48
Не соглашусь с вами :)
1) Компилятор сделал всё правильно. Эти правила просты и понятны, хоть и есть неоднозначность, но не более того.
Тут виновен именно я.

Однажды, кто то из великих заметил: "Я не несу яйца, но разбираюсь в яичнице по лучше любой курицы".
Так вот, к чему это я.. Ах да, когда вот так просто провозглашают истинность "самого строгого компилятора", в то время, когда, видимо, не самые строгие компиляторы кидают сообщение об ошибке: "taking address of temporary" (и не только), то закономерным встаёт вопрос - а не "вырезано цензурой" этот компилятор и "вырезано цензурой" раздутое мнение о нём?)    


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 20:52
Ну не будем о холиварах :D
 
По крайней мере я привел пример строгости - что собранное на MSVC спокойно собирается и mingw и прочим добром.

А вот собранное под minGw для MSVC нужно перековывать, обрабатывать напильником и матерком :)

PS имею в виду кроссплатформенные программы. Те же динамические массивы, которых как бы нет в стандарте :)


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 20:54
Выше m_ax выложил кусок кода с SBGlass и именно ему адресовался вопрос :)

Код
C++ (Qt)
void SBGlass::disableOpacity()
{
   wGlass_->setGraphicsEffect(&QGraphicsOpacityEffect());
}
 
Как только вы по шагам распишите что здесь происходит, то, надеюсь, сами найдете ошибку.

/*Ладно варнинг, а сама программа с этим кодом работает нормально?  ::) */


Название: Re: signed/unsigned
Отправлено: Igors от Июль 04, 2014, 20:55
А я уже ответил :) в самом начале.
А, там был какой-то мутный лепет об отрицательном битике - не хочу даже искать.
Код
C++ (Qt)
int str[10];
str[0] = 0xC3000000;
unsigned int c2 = 0xC3000000;
bool test = (str[0] == c2);
 
Вот и здесь мы сравниваем отрицательное число с положительным - но здесь они оказываются равны


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 20:56
По крайней мере я привел пример строгости - что собранное на MSVC спокойно собирается и mingw и прочим добром.
А где это вы привели?
По моему опыту, все ровно наоборот, программы деланные для msvc очень не просто собрать любым другим компилятором, что не скажешь про gcc, clang, icc, которые легко собирают код деланный друг для друга.

PS имею в виду кроссплатформенные программы. Те же динамические массивы, которых как бы нет в стандарте :)
Это каких массивов нет в стандарте? И в каком стандарте?


Название: Re: signed/unsigned
Отправлено: kambala от Июль 04, 2014, 21:13
PS имею в виду кроссплатформенные программы. Те же динамические массивы, которых как бы нет в стандарте :)
Это каких массивов нет в стандарте? И в каком стандарте?
имеется в виду следующее, что в gcc/mingw компилируется без ошибок:
Код
C++ (Qt)
int n; // как-то вычислили
int arr[n];


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 21:17
имеется в виду следующее, что в gcc/mingw компилируется без ошибок:
Код
C++ (Qt)
int n; // как-то вычислили
int arr[n];
В c++14 будет, ждать осталось не долго. :)


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 21:29
Таки да, видимо долго придётся ждать. Эти динамики мозг съели при переносе с mingw. Вещь удобная, но в MSVС для поддержки того же функционала приходится чуть ли не полпрограммы переписывать. Любят эти массивы линуксоиды, что и говорить :D

А в приведённом коде устанавливается пустой эффект, умирающий по уходу из функции. И таки да, работает :D


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 21:39
А в приведённом коде устанавливается пустой эффект, умирающий по уходу из функции. И таки да, работает :D
А не проще передать 0 или удалить объект эффекта?
Вам везет, что эффекты наследуются от QObject и сообщают о своем разрушении. А в общем случае, передавать указатель на локальный объект очень опастно и в большинстве случаев приводят к падению.


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 21:47
Собственно насколько я помню этот ход я взял из исходников Qt :)


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 21:48
Собственно насколько я помню этот ход я взял из исходников Qt :)
Ну и что?


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 04, 2014, 23:20
Ну и то, что он там используется именно для тех же целей и не вызывает пагубных действий.

Если вы о "почему не Null", то я доверился троллям и насколько я помню, там была какая то проблема именно с передачей объекта, а не нулевого указателя. Точно не помню, к сожалению ^.^


Название: Re: signed/unsigned
Отправлено: Old от Июль 04, 2014, 23:31
Ну и то, что он там используется именно для тех же целей и не вызывает пагубных действий.
Я вам написал выше, почему конкретно этот случай не приводит к пагубным последствиям. Но таких случаев единицы, а которые приводят их 100500. :)
Но у вас же есть 3 дня, что бы с этим разобраться.

И да, если такой код есть в Qt (хотя я до сих пор сомневаюсь), остается только сожалеть.


Название: Re: signed/unsigned
Отправлено: Bepec от Июль 05, 2014, 01:10
Не вижу ничего стоящего сожаления :) Ну да ладно.


Название: Re: signed/unsigned
Отправлено: Old от Июль 05, 2014, 07:03
Не вижу ничего стоящего сожаления :) Ну да ладно.
Ну значит у вас все впереди. Потратите еще три дня и увидите. :)


Название: Re: signed/unsigned
Отправлено: kambala от Июль 09, 2014, 18:59
наткнулся на информацию по поводу ссылки на временный объект: http://stackoverflow.com/a/9779765/1971301