C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problème de compilation: opérateur +=

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Patrick 'Zener' Brunet
Guest





PostPosted: Sun May 06, 2007 9:12 am    Post subject: Problème de compilation: opérateur += Reply with quote



Bonjour.

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code suivant:

typedef unsigned __int16 U16; /* Selon types génériques disponibles */
....
U16 umTest1, umTest2;
....
umTest1 += UmTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16, possible
loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?

Qu'en pensez-vous ? Merci.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/
Back to top
Artus RAFI-TURENNE
Guest





PostPosted: Sun May 06, 2007 2:11 pm    Post subject: Re: Problème de compilation: opérateur += Reply with quote



"Patrick 'Zener' Brunet" <use.link.in.signature (AT) ddress (DOT) invalid> a écrit dans
le message de news:f1k4sf$nnb$1 (AT) shakotay (DOT) alphanet.ch...
Quote:
Bonjour.

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:

typedef unsigned __int16 U16; /* Selon types génériques disponibles
*/
...
U16 umTest1, umTest2;
...
umTest1 += UmTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16, possible
loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?


Mais est-ce une double coquille ce : UmTest2, à la place de umTest2 ?
Back to top
Patrick 'Zener' Brunet
Guest





PostPosted: Sun May 06, 2007 3:10 pm    Post subject: Re: Problème de compilation: opérateur += Reply with quote



Bonjour.

"Artus RAFI-TURENNE" <ArtusRafy (AT) hotmail (DOT) com> a écrit dans le message news:
f1k65h$emc$1 (AT) news (DOT) tiscali.fr...
Quote:

"Patrick 'Zener' Brunet" <use.link.in.signature (AT) ddress (DOT) invalid> a écrit
dans
le message de news:f1k4sf$nnb$1 (AT) shakotay (DOT) alphanet.ch...
Bonjour.

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme
tout
provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:

typedef unsigned __int16 U16; /* Selon types génériques
disponibles
*/
...
U16 umTest1, umTest2;
...
umTest1 += UmTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16,
possible
loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?


Mais est-ce une double coquille ce : UmTest2, à la place de umTest2 ?


Oui, navré Sad les effets de la sélection automatique dans le mailer :-@

Le code compile à ce warning près, sinon il y aurait un identifiant inconnu.

il faut lire:

umTest1 += umTest2;

remplacé par:

umTest1 = (U16) (umTest1 + umTest2);

Merci.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/
Back to top
Serge Paccalin
Guest





PostPosted: Sun May 06, 2007 3:31 pm    Post subject: Re: Problème de compilation: opérateur += Reply with quote

Le dimanche 6 mai 2007 à 10:56:18, Patrick 'Zener' Brunet a écrit dans
fr.comp.lang.c++ :

Quote:
J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.

Ça part d'un bon sentiment.

Quote:
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code suivant:
...
umTest1 += umTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16, possible
loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);

Autre solution : désactiver ce warning-là dans ces cas-là :

#pragma warning (disable: 4244) // "+-" ..., possible loss of data

--
___________
_/ _ \_`_`_`_) Serge PACCALIN -- sp ad mailclub.net
\ \_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
Back to top
Patrick 'Zener' Brunet
Guest





PostPosted: Sun May 06, 2007 6:28 pm    Post subject: Re: Problème de compilation: opérateur += Reply with quote

Bonjour.

"Serge Paccalin" <sp (AT) mailclub (DOT) no.spam.net.invalid> a écrit dans le message
news: 18q535ho2dv2f.dlg@canttouchthis-127.0.0.1...
Quote:
Le dimanche 6 mai 2007 à 10:56:18, Patrick 'Zener' Brunet a écrit dans
fr.comp.lang.c++ :

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme
tout provider est supposé le faire.

Ça part d'un bon sentiment.


J'imagine celui du user qui veut compiler son code en W4 et qui prend des
warnings dans une librairie de templates.

Quote:
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:
...
umTest1 += umTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16,
possible loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + umTest2);

Autre solution : désactiver ce warning-là dans ces cas-là :

#pragma warning (disable: 4244) // "+-" ..., possible loss of data


J'ai même une technique portable pour désactiver / réactiver un warning de
part et d'autre d'une section.

Je fais ça pour certains idiomes que j'utilise souvent de manière sûre:

4706, pour ecrire par exemple:
if( bCheck = (x == y))

4355, pour passer des références de parents à des child nodes

4060/4065, pour autoriser des switch() vides...

Mais par contre pour le 4244, faire ça à chaque utilisation est encore plus
lourdingue que la forme ci-dessus, et le désactiver globalement désarme une
alerte vraiment utile.

C'est d'autant plus bête que le débordement de mantisse n'est pas pris en
compte, seulement la perte de signe. Ce que je comprendrais pour
l'opérateur -= mais avec le += c'est pas fin du tout.

Merci.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/
Back to top
Patrick 'Zener' Brunet
Guest





PostPosted: Tue May 08, 2007 9:12 am    Post subject: Re: Problème de compilation: opérateur += Reply with quote

Bonjour.

"Patrick 'Zener' Brunet" <use.link.in.signature (AT) ddress (DOT) invalid> a écrit dans
le message news: f1k4sf$nnb$1 (AT) shakotay (DOT) alphanet.ch...
Quote:
J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:

typedef unsigned __int16 U16; /* Selon types génériques dispos */
...
U16 umTest1, umTest2;
...
umTest1 += umTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16,
possible loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + umTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?

Qu'en pensez-vous ? Merci.


Donc finalement après de longues recherches, j'ai dû retomber au niveau de
warning 3 + option "treat warnings as errors" et là ça passe sans problème.

En principe les deux formes ci-dessus sont strictement équivalentes, la
première étant calculée exactement comme la seconde.

Ben visiblement c'est pas au point sur ce compilo Sad
D'ailleurs en cherchant sur Google "warning 4244 bogus" on trouve énormément
de projets où il est désactivé avec cette explication sommaire... Ce qui
n'est pas forcément 100% crédible bien sûr.

Je préfère ne pas désactiver globalement ce warning parce que cela
supprimerait sans discrimination toute sécurité sur les conversions.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.