[debutant][résolu]C++ et QT4...Conversion de type??

C++ et QT4...Conversion de type?? [debutant][résolu] - C++ - Programmation

Marsh Posté le 18-10-2007 à 10:56:58    

Bonjour,
 
J'ai une question qui va surement vous paraître tout bête mais je coince dessus  :(  
 
Voila mon code (la partie intéressante) :
 

Code :
  1. void Interface::test(int num1, int num2)
  2.     {
  3.     float rapport = ((num1 / num2)/1000);
  4.     QString test;
  5.     test.sprintf( "%f", rapport);
  6.     interface.bouton->setText(rapport)
  7.      }


 
A la compilation l'erreur : "no matching fonction for call to 'QPushButton::setText(&float)'" a lieu au niveau du setText.
On a, pour information, num1>num2 et 0<rapport<1...
Je pense que c'est un problème de conversion de type...mais la fonction sprintf devrait traiter normalement ma variable rapport même si c'est un float même si là, apparemment, la conversion en QString ne se fait pas.

Message cité 1 fois
Message édité par Joker28 le 23-10-2007 à 17:41:49
Reply

Marsh Posté le 18-10-2007 à 10:56:58   

Reply

Marsh Posté le 18-10-2007 à 11:10:15    


Code :
  1. void Interface::test(int num1, int num2)
  2.     {
  3.     float rapport = ((num1 / num2)/1000);
  4.     QString test;
  5.     test.sprintf( "%f", rapport);
  6.     interface.bouton->setText(test)
  7.      }


 
 
En fait, cette méthode ne fonctionne pas, mais celle-ci fonctionne :
 

Code :
  1. void Interface::test(int num1, int num2)
  2.     {
  3.     QString test;   
  4.     test.sprintf( "%f", ((float)(num1 / num2)/1000));
  5.     interface.bouton->setText(test)
  6.      }


 
Pourquoi?


Message édité par Joker28 le 18-10-2007 à 11:23:04
Reply

Marsh Posté le 18-10-2007 à 13:28:43    

Salut,
 
Dans ton premier post, tu passais ton float, et pas le QString que tu venais de créer donc tu ne risquais pas d'aller bien loin.
 
Dans ton 2nd post:
> le premier bout de code fonctionne (dans le sens ça compile), mais tu fais une division d'entier, donc ton rapport ne sera jamais le bon
> Le second est l'équivalent du premier, sauf pour la création du rapport qui sera bon vu que tu passes l'une des opérandes en flottant.
 
Mais foin de tout ça, tu as plus simple, et tu peux faire cette fonction en une ligne avec QString::number.

Reply

Marsh Posté le 18-10-2007 à 15:17:38    

Hop :
 
- Le premier message, l'erreur est une faute de frappe, j'ai mal édité par la suite...:)
- Merci beaucoup pour ton indication, ça marche maintenant même si mon code est pas aussi simple que ton indication :
 

Code :
  1. void Interface::test(int num1, int num2)
  2.     {
  3.     int rapport = num1 / num2;
  4.     int rapport2 = rapport / (float)1000 ;
  5.     QString test;
  6.     test.sprintf( "%f", rapport2);
  7.     interface.bouton->setText(test);
  8.     interface.bouton->setGeometry(rapport2,y,width,height);
  9.      }


 
Merci beaucoup en tout cas!

Reply

Marsh Posté le 18-10-2007 à 15:26:41    

Là encore, tu fais des divisions entières...
Ce que je voulais dire, c'est que tu pouvais te simplifier la vie; ça reste valable, même avec la manip sur la géométrie:

Code :
  1. void Interface::test(int num1, int num2)
  2. {
  3.     float rapport = static_cast<float>(num1) / num2; // Avoir un vrai ratio
  4.     float rapport2 = rapport / 1000.0; // Pas besoin de (float)1000, alors que 1000.0 est un flottant (et que de toute façon le rapport précédent en est maintenant un)
  5.     interface.bouton->setText(QString::number(rapport2));
  6.     interface.bouton->setGeometry(static_cast<int>(rapport2),y,width,height);
  7. }


(Et je ne vois pas pourquoi tu as besoin de 2 ratio?)
Le cast vers l'entier pour obtenir x est juste un troncage; si tu veux un arrondi, regarde la ref de cmath.

 

Edit: correction.


Message édité par IrmatDen le 18-10-2007 à 15:31:35
Reply

Marsh Posté le 23-10-2007 à 17:41:32    

Merci!!

Reply

Marsh Posté le 23-10-2007 à 17:44:46    

wof le static_cast. float(num1) ça le fait pareil. Pas la peine de branler la nouille en float pour ensuite faire du double ...

Reply

Marsh Posté le 23-10-2007 à 17:56:51    

Je sais :o
 
Mais tu m'excuseras d'utiliser les cast C++ sur les forums C++: même si c'est plus verbeux, ça force les débutants qui lisent le code à se poser la question type "c'est quoi ce cast?" et éventuellement approfondir la réponse et découvrir les autres. Et si je le fais ainsi, c'est parce que j'ai déjà eu le cas de débutant qui font des cast C sur des pointeurs, et qui demande ce que c'est qu'un dynamic_cast etc...
Je pars du principe que si je pose du code à priori pour débutant, j'essaie (je dis pas que j'y arrive tout le temps, loin de là) de faire du code propre.

Reply

Marsh Posté le 23-10-2007 à 18:34:26    

pas d'accord. chaque fois que tu peux éviter un cast, il faut le faire. Sinon tu formes juste des gens à cacher leurs problèmes derrière un cast "tiens je vais essayer de caster"

Reply

Marsh Posté le 23-10-2007 à 18:41:07    

Ok, mais comment tu évites le premier cast alors? (Dans l'optique de le faire en 2 lignes comme il l'a fait)
Chez moi, int/int ça ne donne jamais le vrai ratio (après j'ai peut-être raté quelque chose).

Reply

Marsh Posté le 23-10-2007 à 18:41:07   

Reply

Marsh Posté le 24-10-2007 à 11:34:04    

tu cast pas, tu construis.

Reply

Marsh Posté le 24-10-2007 à 12:19:38    

Comment stp?
Sérieux, je vois pas où tu veux en venir :/ Je doute pas que tu ais raison, mais je ne te suis pas ici :(

Reply

Marsh Posté le 27-10-2007 à 17:55:40    

Taz a écrit :

wof le static_cast. float(num1) ça le fait pareil. Pas la peine de branler la nouille en float pour ensuite faire du double ...


[:quoted]

Reply

Marsh Posté le 27-10-2007 à 18:46:56    

je pense que on veut en venir là :
 

Code :
  1. void Interface::test(int num1, int num2)
  2. {
  3.     float rapport = float(num1) / num2;
  4.     float rapport2 = rapport / 1000.0f;
  5.   // ...
  6. }


 
tu utilises le constructeur de float pour construire un float à partir de num1.  
Ensuite 1000.0 c'est un double, 1000.0f c'est un float :o

Reply

Marsh Posté le 27-10-2007 à 19:22:38    

Merci :jap:
Ok pour le second point, je l'ignore trop souvent (la preuve...)
 
Pour le premier, je vois pourtant souvent que cette construction, bien que valide, devrait être évitée en C++. Je retrouve des liens à ce sujet dès que possible je dois partir vite là ;)

Reply

Marsh Posté le 29-10-2007 à 09:07:44    

IrmatDen a écrit :

Pour le premier, je vois pourtant souvent que cette construction, bien que valide, devrait être évitée en C++. Je retrouve des liens à ce sujet dès que possible je dois partir vite là ;)

Ca doit être une raison fracassante pour que tu t'en souviennes aussi bien.

Reply

Marsh Posté le 29-10-2007 à 09:45:00    

IrmatDen a écrit :

Merci :jap:
Pour le premier, je vois pourtant souvent que cette construction, bien que valide, devrait être évitée en C++.


 
 :heink: le typecasting by construction c'est quadn même l'idiome de base du langaeg hein.
Les gens qui disent "éviter" ça ne comrpennent rien au langage ou alors ne savent pas ce que ca veut dire :o

Reply

Marsh Posté le 29-10-2007 à 14:10:55    

Bon en vrac:
 
> http://forum.hardware.fr/hfr/Progr [...] 3049_1.htm : 3 court messages, je ne fais pas les citations qui vont avec vu le peu de messages;
> https://www.securecoding.cert.org/c [...] tyle+casts : pas d'explication donnée, mais considéré comme mauvaise pratique (tout au moins dans le contexte de je sais pas quelle certif...)
> http://www.informit.com/guides/con [...] m=134&rl=1 : l'exemple est plus tordu et l'utilisation des cast C++ y est apparemment normal. Ceci dit, voici l'intro:

Citation :

Originally, the C++ standardization committee wanted to deprecate C-style casting, thereby enforcing the use of the new cast operators exclusively. However, because C-style casts are widely used in legacy code and because many C++ compilers serve as C compilers, the committee decided against doing so. That said, C++ programmers are encouraged to use the new cast operators.


> http://forum.hardware.fr/hfr/Progr [...] 2816_1.htm (suivre les réponses de ++fab en particulier)
> http://web.mit.edu/merolish/ticpp/ [...] l#Index808 :  

Citation :

A static_cast is used for all conversions that are well-defined. These include "safe" conversions that the compiler would allow you to do without a cast and less-safe conversions that are nonetheless well-defined. The types of conversions covered by static_cast include typical castless conversions, narrowing (information-losing) conversions, forcing a conversion from a void*, implicit type conversions, and static navigation of class hierarchies


 
Et comme je sais en savoir nettement que vous et qu'eux, ben, j'essaie de m'appliquer. Est-ce que vous utiliseriez (j'aimerais qu'on reste sur ce cas particulièrement basique pour restreindre le débat) le casting C pour sauver quelques petites frappes de clavier dans un contexte que vous considérez comme sûr?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed