Utilisation d'un reinterpret_cast ?

Résolu
romain60112 Messages postés 70 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 17 avril 2013 - 15 avril 2010 à 10:23
theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010 - 16 avril 2010 à 14:20
Bonjour,

J'ai un petit soucis de conversion, voici mon problème :

CString m_tempsminz1;
unsigned long int Zone1; // de 0 à FF FF FF
unsigned long int Zone2; // de 0 à FF FF FF
unsigned long int CalcZones
CalcZones = (Zone1+Zone2);

CProgressCtrl *pProgressz1 =static_cast<CProgressCtrl *>(GetDlgItem(IDC_PROGRESSZ1));
CProgressCtrl *pProgressz2 =static_cast<CProgressCtrl *>(GetDlgItem(IDC_PROGRESSZ2));

pProgressz1->SetRange(0, CalcZones);
pProgressz1->SetPos(Zone1);

Les soucis :

warning C4244: 'argument' : conversion de 'unsigned __int64' en 'short', perte possible de données
error C2664: 'void ATL::CStringT::Format(const wchar_t *,...)' : impossible de convertir le paramètre 1 de 'const char [3]' en 'const wchar_t *'
with
[
BaseType=wchar_t,
StringTraits=StrTraitMFC_DLL<wchar_t>
]
Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction

Quels solutions me proposez vous pour résoudre le warning et l'erreur ?

Cordialement
Romain

4 réponses

theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
16 avril 2010 à 14:20
Pour ton warning et vu la taille de tes variables (> taille d'un short) je te conseille d'utiliser plutôt la méthode SetRange32() comme suit :

pProgressz1->SetRange32(0, (int)CalcZones); // warning C4244

Cela réglera ton warning.

De plus, encore en me basant sur le code que tu as écrit je te conseillerai plutôt de faire des déclarations en int comme suit :

int Zone1; // de 0 à FF FF FF
int Zone2; // de 0 à FF FF FF
int Zone3; // de 0 à FF FF FF
(la somme des 3 valeurs max sera au pire de 02 FF FF FD qui tient aussi sur un (int) donc pas de problème a priori.

De cette manière tu n'auras même plus besoin de caster ton paramètre en (int) lors de l'appel à SetRange32(...)



++
Mess with the best, die like the rest
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 avril 2010 à 11:11
Utilise par ordre de préférence les casts suivants:
- static_cast
- reinterpret_cast
- C cast

Je ne peux pas t'aider plus, je ne suis pas calé sur les MFC.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
16 avril 2010 à 12:39
Question : quand appelles tu la méthode "Format" ? Cela n'apparait pas sur ton code.

Essaie d'etre précis sur les lignes incriminées par le warning et l'erreur sinon on va pas s'en sortir.

Pour ton erreur en tout cas lors de l'appel à Format(...) tu as juste à entourer ta chaine de caractères passée en premier argument par la macro TEXT(...) (ex : TEXT("%d"))

OU

tu rajoutes un L juste devant la même chaine de caractères (ex : L"%d") et ton erreur sera réglée.

Pour le warning, merci d'indiquer la ligne incriminée (idem pour l'erreur histoire de confirmer ce que je viens de dire)

++
Mess with the best, die like the rest
0
romain60112 Messages postés 70 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 17 avril 2013 1
16 avril 2010 à 13:37
Le problème de l'erreur est résolue merci !!

Et maintenant pour le warning :

unsigned long int Zone1; // de 0 à FF FF FF
unsigned long int Zone2; // de 0 à FF FF FF
unsigned long int Zone3; // de 0 à FF FF FF

CalcZones = Zone1+Zone2+Zone3;

pProgressz1->SetRange(0, CalcZones); // warning C4244

warning C4244: 'argument' : conversion de 'unsigned __int64' en 'short', perte possible de données

Cordialement
Romain
0
Rejoignez-nous