Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre éclairé Avatar de awalter1
    Inscrit en
    août 2004
    Messages
    888
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 888
    Points : 318
    Points
    318

    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

  2. #2
    Membre expérimenté

    Ingénieur développement matériel électronique
    Inscrit en
    juillet 2010
    Messages
    302
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2010
    Messages : 302
    Points : 534
    Points
    534

    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 éclairé Avatar de awalter1
    Inscrit en
    août 2004
    Messages
    888
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 888
    Points : 318
    Points
    318

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

  4. #4
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    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 664
    Points : 12 539
    Points
    12 539

    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 éclairé Avatar de awalter1
    Inscrit en
    août 2004
    Messages
    888
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 888
    Points : 318
    Points
    318

    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
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    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 664
    Points : 12 539
    Points
    12 539

    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 éclairé Avatar de awalter1
    Inscrit en
    août 2004
    Messages
    888
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 888
    Points : 318
    Points
    318

    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 Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    23 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 817
    Points : 31 660
    Points
    31 660

    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 éclairé Avatar de awalter1
    Inscrit en
    août 2004
    Messages
    888
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 888
    Points : 318
    Points
    318

    Par défaut

    Merci de votre aide

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •