Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1475 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1626233
Joker28
Posté le 18-10-2007 à 10:56:58  profilanswer
 

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
mood
Publicité
Posté le 18-10-2007 à 10:56:58  profilanswer
 

n°1626245
Joker28
Posté le 18-10-2007 à 11:10:15  profilanswer
 


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
n°1626322
IrmatDen
Posté le 18-10-2007 à 13:28:43  profilanswer
 

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.

n°1626519
Joker28
Posté le 18-10-2007 à 15:17:38  profilanswer
 

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!

n°1626529
IrmatDen
Posté le 18-10-2007 à 15:26:41  profilanswer
 

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
n°1629559
Joker28
Posté le 23-10-2007 à 17:41:32  profilanswer
 

Merci!!

n°1629563
Taz
bisounours-codeur
Posté le 23-10-2007 à 17:44:46  profilanswer
 

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

n°1629568
IrmatDen
Posté le 23-10-2007 à 17:56:51  profilanswer
 

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.

n°1629596
Taz
bisounours-codeur
Posté le 23-10-2007 à 18:34:26  profilanswer
 

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"

n°1629597
IrmatDen
Posté le 23-10-2007 à 18:41:07  profilanswer
 

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).

mood
Publicité
Posté le 23-10-2007 à 18:41:07  profilanswer
 

n°1629962
Taz
bisounours-codeur
Posté le 24-10-2007 à 11:34:04  profilanswer
 

tu cast pas, tu construis.

n°1630020
IrmatDen
Posté le 24-10-2007 à 12:19:38  profilanswer
 

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 :(

n°1632159
Taz
bisounours-codeur
Posté le 27-10-2007 à 17:55:40  profilanswer
 

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]

n°1632170
Joel F
Real men use unique_ptr
Posté le 27-10-2007 à 18:46:56  profilanswer
 

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

n°1632173
IrmatDen
Posté le 27-10-2007 à 19:22:38  profilanswer
 

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à ;)

n°1632676
Taz
bisounours-codeur
Posté le 29-10-2007 à 09:07:44  profilanswer
 

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.

n°1632701
Joel F
Real men use unique_ptr
Posté le 29-10-2007 à 09:45:00  profilanswer
 

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

n°1632861
IrmatDen
Posté le 29-10-2007 à 14:10:55  profilanswer
 

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?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
zippage de fichiers et répertoires dans plusieurs fichiers zip (Résolu[VBA Excel] Appliquer couleur sur une partie de chaine
[RESOLU]évènements souris[ORACLE] Conversion notation scientifique -> decimal
afficher du texte avec SDL_ttf [resolu][Résolu] Problème avec la fonction Ubound
[CSS] Decentrage du contenu d'un tableau [résolu][resolu] cppunit
[résolu] normes w3c et naviguateurs 
Plus de sujets relatifs à : [debutant][résolu]C++ et QT4...Conversion de type??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR