IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

portage source machine 32 à 64 bits


Sujet :

C

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre expérimenté

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 545
    Points : 1 429
    Points
    1 429
    Par défaut
    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*

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    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 !

  5. #5
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    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.

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    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 !

  7. #7
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    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.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    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.

  9. #9
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci de votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Machine virtuelle 64 bits
    Par geroma dans le forum VMware
    Réponses: 0
    Dernier message: 27/11/2013, 15h19
  2. Réponses: 1
    Dernier message: 11/09/2012, 13h04
  3. Comment configurer une source de donnees ODBC sur une machine 64 bits
    Par kazemarrabou dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 05/11/2011, 02h37
  4. machine virtuel 32 bits sur du 64 bits
    Par Francky44003 dans le forum Virtualisation
    Réponses: 2
    Dernier message: 24/01/2011, 10h05
  5. Convertir Source C 32--> 64 bits
    Par da_mind_stroka dans le forum Visual C++
    Réponses: 1
    Dernier message: 06/11/2006, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo