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 :

Incompatibilité des normes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    La deuxième solution ne me convient pas, ça consisterait à remplacer un warning par un autre (ayant la même signification : ISO C forbids ...)

    Tu voudrais donc caster en un type entier ? Mais pouquoi un size_t en particulier ? de plus je ne connais pas la norme mais le problème semble revenir au même : il faut que le type entier soit de taille suppérieure ou égale à la taille d'un pointeur sur un objet ...

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par PRomu@ld
    il faut que le type entier soit de taille suppérieure ou égale à la taille d'un pointeur sur un objet ...
    Ce qui n'est pas toujours le cas:

    Citation Envoyé par Itanium 2
    Taille int: 4
    Taille void*: 8
    Jc

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    C'était bien ce que je pensais !

    Sur les trois solutions proposées, deux sont donc impossibles, reste à voir la troisième : le memcpy, je n'ai pas le temps de tester mais si quelqu'un s'en sent l'envie ...

  4. #4
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Ceci fonctionne (avec memcpy, et en passant par un void* intermediaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dlfcn.h>
     
    int main (void)
    {
      void *handle, *vp;
      char *error;
      double (*cosine)(double);
     
      handle = dlopen ("libm.so", RTLD_LAZY);
      if (!handle) {
        fprintf (stderr, "%s\n", dlerror());
        exit(1);
      }
     
      vp = dlsym(handle, "cos");
      if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s\n", error);
        exit(1);
      }
      memcpy (&cosine, &vp, sizeof cosine);
     
      printf ("%f\n", (*cosine)(2.0));
      dlclose(handle);
     
      return EXIT_SUCCESS;
    }
     
    /* EOF */
    $ gcc -Wextra -Wall -ansi -pedantic -O2 -ldl ./tt.c
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    size_t fait la même taille que void*...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par loufoque
    size_t fait la même taille que void*...
    Ce n'est absolument pas garanti pas la norme.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je crois que c'est valable d'après POSIX.
    Au pire y'a uintptr_t.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    2°)
    warning: ISO C forbids casts to union type
    Euh... Tu essaies de caster directmeent le résultat en union? Ce n'est pas ça, un "union cast": c'est de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union fun_ptr ufp;
    ptrfonction_t pt_f; /* Un pointeur du type exact de la fonction voulue */
    ufp.p = dlsym()...
    pt_f = (ptrfonction_t)ufp.fp_int; /* Je ne sais plus si ici, un cast sera nécessaire ou non */
    3°) Je pense qu'uintptr_t est préférable à size_t.
    Mais en effet, je crois bien que size_t est voué à avoir la même taille qu'un pointeur (c'est le cas sous Win32/64, et c'était le cas sous DOS (un size_t avait la taille d'un pointeur court, le type normal de pointeur. Mais pour un pointeur long, il fallait utiliser un entier long)). Et puis, uintptr_t est directement convertible pour porter un programme sous Windows (un petit typedef UINT_PTR uintptr_t; et ça compile sans problème)
    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
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Euh... Tu essaies de caster directmeent le résultat en union? Ce n'est pas ça, un "union cast": c'est de faire:
    Ok merci bien ! Dsl pour l'erreur, j'avais pas vérifié ce que je faisais, en fait c'était plutôt idiot ! (En période de révision, l'attention est ailleur ...)

    Mais en effet, je crois bien que size_t est voué à avoir la même taille qu'un pointeur
    C'est dans la norme ou pas ? (C pas POSIX).

    Mais perso, le memcpy me plait plutôt bien. Il faudra que je vérifie si le système à un pointeur de fonction de taille inférieure ou égale à la la taille d'un pointeur sur objet. (mais ça c'est valable pour toutes les solutions)

Discussions similaires

  1. Existe-t-il des normes de programmation générale ?
    Par Matmal11 dans le forum Langages de programmation
    Réponses: 66
    Dernier message: 29/03/2008, 23h18
  2. Réponses: 3
    Dernier message: 07/01/2008, 10h09
  3. Créer des normes de codage sous Eclipse
    Par As2piK dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/10/2007, 18h54
  4. [WinDev 10] Respect des normes de codage
    Par raoudha dans le forum WinDev
    Réponses: 3
    Dernier message: 16/02/2007, 15h06
  5. [XSD] Incompatibilité des types xs:ID et xs:IDREF ?
    Par Cpt.FLAM dans le forum Valider
    Réponses: 6
    Dernier message: 08/04/2005, 14h54

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