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 :

#define sizeof(pointeur)


Sujet :

C

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut #define sizeof(pointeur)
    salut à tous,

    Mon sujet n'est pas très clair mais le problème est assez obscur lui aussi. Je voudrais pouvoir récupérer le type d'un pointeur (int, short int, long int) et ce quelque soit l'os, l'architecture utilisés. Pour ça, j'essaye de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void *xxyyzz;
    #if !(defined(POINTER))
    #if (sizeof(*xxyyzz)==sizeof(int))
    #define POINTER int
    #endif
    #if (sizeof(*xxyyzz)==sizeof(short int))
    #define POINTER short int
    #endif
    #endif
    Mais mon compilo (gcc3) se plaint d'un opérateur binaire manquant avant la paranthèse située après le premier sizeof (donc il se plaint sur mon sizeof ).
    La petite condition supplémentaire c'est que je dois utiliser #define et non pas une variable avec un test sur le pointeur en début de programme comme c'est faisable facilement.
    Est-ce que quelqu'un aurait une solution à ce problème ???
    Merci d'avance

  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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Tu ne peux pas faire de sizeof dans une condition #if

    The preprocessor does not know anything about types in the language. Therefore, sizeof operators are not recognized in #if, and neither are enum constants. They will be taken as identifiers which are not macros, and replaced by zero. In the case of sizeof, this is likely to cause the expression to be invalid.
    http://developer.apple.com/documenta...cpp/If.html#If

    Sinon, je ne vois pas vraiment à quoi servirait cette idée... Peut-être que mon esprit est encore dans le brouillard causé par le weekend...

    Jc

  3. #3
    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 Re: #define sizeof(pointeur)
    Citation Envoyé par le mage tophinus
    Pour ça, j'essaye de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void *xxyyzz;
    #if !(defined(POINTER))
    #if (sizeof(*xxyyzz)==sizeof(int))
    Marche pas. sizeof est évalué après l'expansion du préprocésseur. Ce qui est inconnu est remplacé par 0 donc :
    Tu as un problème de conception. Je ne vois pas pourquoi tu veux faire ça. Quel est le exactement le problème à résoudre ?

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    Pas cool tout ça

    Pour simplifier énormément :
    Mon programme crée un autre code source C. Mais dans ce nouveau code source C, les pointeurs peuvent être modifiés numériquement par le contenu d'un autre pointeur. Exemple d'un bout de code du nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void *pointeur1, *pointeur2;
    ...
    pointeur2=read_value();
    ...
    pointeur1=pointeur1+(POINTER)(*pointer2);
    Le problème c'est que ce genre de chose plante un gros warning (voire une erreur) si on ne mets pas POINTER pour lui spécifier qu'on ne fais pas de bétises et qu'on travaille bien sur un pointeurs et le contenu d'un autre pointeur. Notez que pointer2 est supposé pointer vers une adresse mémoire valide dans ce cas précis.

    Maintenant j'ai pensé à faire des doubles pointeurs pour éviter ce #define, mais je suis pas sûr qu'au niveau de la mémoire ça passe comme il faut (i.e. pas de segfault) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void **pointeur1, **pointeur2;
    ...
    *pointeur2=read_value();
    ...
    *pointeur1=*pointeur1+**pointer2;
    Et puis comme je n'ai jamais travaillé avec des doubles pointeurs, je suis certainement en train de dire une grosse bétise

    Voilà, j'espère que j'ai été assez clair sinon j'essaierais de préciser un peu plus même si je vois pas comment vous expliquer mieux le problème...

  5. #5
    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 le mage tophinus
    Mon programme crée un autre code source C.
    C'est donc un générateur de code. Ok.
    Mais dans ce nouveau code source C, les pointeurs peuvent être modifiés numériquement par le contenu d'un autre pointeur. Exemple d'un bout de code du nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void *pointeur1, *pointeur2;
    ...
    pointeur2=read_value();
    ...
    pointeur1=pointeur1+(POINTER)(*pointer2);
    Ok. Le problème est de définir POINTER. Si le générateur de code connait le type exact, il peut faire ça :
    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
     
       switch (type)
       {
       case T_CHAR:
          fprintf (fp, "#define POINTER (char*)\n");
          break;
       case T_SHORT:
          fprintf (fp, "#define POINTER (short*)\n");
          break;
       case T_INT:
          fprintf (fp, "#define POINTER (int*)\n");
          break;
       case T_LONG:
          fprintf (fp, "#define POINTER (long*)\n");
          break;
       }

  6. #6
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Citation Envoyé par le mage tophinus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void **pointeur1, **pointeur2;
    ...
    *pointeur2=read_value();
    Ca, c'est un plantage garanti:

    Là, tu définis pointeur2, qui est un pointeur sur un pointeur. Mais son contenu (c'est à dire *pointeur2) est null ou pire totalement aléatoire (selon que c'est une variable globale ou locale).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *pointeur2=read_value();
    => Ecran bleu

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    Citation Envoyé par 10_GOTO_10
    Là, tu définis pointeur2, qui est un pointeur sur un pointeur. Mais son contenu (c'est à dire *pointeur2) est null ou pire totalement aléatoire (selon que c'est une variable globale ou locale).
    Bon, ça me rassure de savoir que j'ai au moins compris ça

    Citation Envoyé par Emmanuel Delahaye
    Ok. Le problème est de définir POINTER. Si le générateur de code connait le type exact, il peut faire ça :
    Arf, j'ai honte j'y avais même pas pensé et en plus ça m'a permis de trouver une erreur que j'aurais pu avoir avec le source généré. En tout cas, ça résout mon problème. Merci beaucoup

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

Discussions similaires

  1. [define] création d'un symbole pointeur
    Par tails dans le forum C
    Réponses: 1
    Dernier message: 13/02/2012, 15h17
  2. Sizeof d'un pointeur sur char ...
    Par Mike888 dans le forum C
    Réponses: 8
    Dernier message: 03/11/2005, 13h04
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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