Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 12h49   #1
awalter1
Membre éclairé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 881
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 881
Points : 316
Points : 316
Par défaut portage source machine 32 à 64 bits

Bonjour,
Je dois porter mes application d'une machine linux 32 bits vers une machine 64 bits :
Code :
1
2
3
4
>machine 32> uname -m
i686
>machine 64> uname -m
x86_64
Je n'ai pas de warning de compilation sur ma machine 32, par contre en 64 bits j'ai des warnings concernant des cast. Par exemple :
Code :
1
2
3
int caller;
...
XtAddCallback (Button_Close, XmNactivateCallback, close_cb,(XtPointer) caller);
Le pb vient du cast sur la variable caller.
Si je change "int caller" par "long int caller", ce warning disparait, mais engendre de nouveaux warnings sur la variable caller qui n'est plus du même type ... en cascade cela a de nombreuses répercussions.
Le contenu de mes variables n'a pas changé, je sais donc que tout tient dans des int : un int fait 4 octets en 32 bits ou 64 bits, le pb vient du type long int qui est passé de 4 à 8 octets en 64 bits ( ce qui a du aussi modifier la taille du type XtPointer).

Comment puis je supprimer mon Warning initial de manière élégante, sans changer le type de la variable concernée ?
Merci
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h00   #2
mith06
Membre actif
 
Ingénieur développement matériel électronique
Inscription : juillet 2010
Messages : 140
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement matériel électronique
Secteur : Industrie

Informations forums :
Inscription : juillet 2010
Messages : 140
Points : 199
Points : 199
Salut,

Par définition (norme C je ne sais plus la quelle) la taille d'un int est "au moins 16 bits"

Ton programme n'a pas était écrit dans un esprit de portabilité. Je ne dis pas qu'il n'est pas portable, mais qu'on sont portage va entrainer des effet de bords qu'il va falloir gérer. Si le compilo te génère un warning c'est qu'il y a une raison.

Sinon essai de déclarer "caller" comme un void*
mith06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h41   #3
awalter1
Membre éclairé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 881
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 881
Points : 316
Points : 316
Je confirme que le code n'a pas été écrit pour être portable, mais bon, aujourd'hui il faut l'utiliser sur une machine 64 bits.
J'ai fait le test suivant :
Code :
1
2
3
int caller;
...
XtAddCallback (Button_Close, XmNactivateCallback, close_cb,(XtPointer)(long int) caller);
Ce qui élimine le Warning. Bizarrement "caster" un int en long int ne gène pas le compilateur.
Par ailleurs, dans le cas suivant :
Code :
1
2
3
4
5
6
void range_merge_cb (widget, client_data, call_data) 
   Widget    widget;
   XtPointer client_data, call_data;
{
   int ret;
   ret = (int) client_data;
j'ai une erreur du même type, mais si je fais (double cast) :
Code :
1
2
3
4
5
6
void range_merge_cb (widget, client_data, call_data) 
   Widget    widget;
   XtPointer client_data, call_data;
{
   int ret;
   int = (int)(long int) client_data;
Plus de warning.
J'en conclue qu'on peut caster un int en long int ou un long int en int, mais si ce sont d'autres types, là ça ne passe plus.
Merci
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 17h45   #4
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 434
Points : 12 955
Points : 12 955
Le problème n'est pas sur des cast int<-> long int, mais sur des cast pointeurs<-> entiers dont le comportement est dépendant de l'implémentation, donc complètement non portable et sont à éviter.
__________________
Publication : Concepts en C

Mon avatar : Glenn Gould

--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 07h46   #5
awalter1
Membre éclairé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 881
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 881
Points : 316
Points : 316
Tu as sans doute raison dans l'absolu, cependant lorsque tu développes en X11/Motif tu n'as pas le choix : les interfaces des callbacks imposent leurs type XtPointer pour passer les paramètres.
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 11h25   #6
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 434
Points : 12 955
Points : 12 955
Ce n'est pas surprenant.
Ce qui est surprenant, c'est qu'on passe un entier (caller) là où est attendu un pointeur.
__________________
Publication : Concepts en C

Mon avatar : Glenn Gould

--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 23h18   #7
awalter1
Membre éclairé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 881
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 881
Points : 316
Points : 316
oui, c'est légitime de se poser la question. Je me réfère à la documentation officielle de X11/Motif ou les exemples utilisent le passage de paramètres comme je le fais.
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2013, 14h52   #8
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 384
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2005
Messages : 22 384
Points : 32 024
Points : 32 024
Envoyer un message via MSN à Médinoc
La réponse courte, c'est que tu dois déclarer caller de type intptr_t au lieu de int.
Il doit en être de même pour tous les entiers voués à contenir des adresses.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.
-- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2013, 23h10   #9
awalter1
Membre éclairé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 881
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 881
Points : 316
Points : 316
Merci de votre aide
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h07.


 
 
 
 
Partenaires

Hébergement Web