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 :

intptr_t , entier pouvant contenir un pointeur ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Par défaut intptr_t , entier pouvant contenir un pointeur ?
    Bonjour ,

    Je suis en pleine lecture de code source du langage de programmation Gambas (BASIC pour UNIX).
    Il y a des types de la norme C99 que je n'avais jamais abordé, j'ai regarder le man afin d'obtenir plus d'information sur le sujet, mais j'avoue ne pas comprendre le sens du "type entier pouvant contenir un pointeur".

    Si une âme charitable pourrait m'éclairer un peu ça serait très sympathique.

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    C'est trop vague. Tu pourrais nous donner la référence du type en question ?

    Sinon, même si en principe le C distingue complètement la notion de pointeur et d'entier numérique, une adresse mémoire est en soi un entier non signé, puisque le bus d'adresse est un ensemble de lignes électriques formant un nombre binaire servant à indiquer dans quelle case mémoire on souhaite lire ou écrire.

    Dans le BASIC des années 1980, il n'y avait pas de type « pointeur ». On avait des nombres réels flottants (simple ou double précision), des nombres entiers (signés et sur 16 bits uniquement, en général), et un type « chaîne de caractères » (255 caractères maxi sur BASIC 128 et 512, par exemple). Comme il existait quand même PEEK et POKE pour lire et écrire dans la mémoire, le paramètre d'adresse était nécessairement un entier.

    Comme il y a différentes tailles d'entiers en C, on peut spécifier de manière formelle « tous les types d'entiers assez larges pour représenter une adresse mémoire ».

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Par défaut
    Merci Obsidian pour ta réponse.
    Je te donne en exemple le type Integer du langage Gambas. (je pense que tu faisais allusion au code en parlant de référence)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* Gambas INTEGER datatype definition */
     
    typedef
      struct {
        GB_TYPE type;
        int value;
        #if __WORDSIZE == 64
        int _pad;
        #endif
    		intptr_t _reserved[2];
        }
      GB_INTEGER;
    Donc théoriquement, à l'aide ta réponse, je visualise mieux le principe, mais en pratique, j'ai plus de mal à cerner l'utilisation de ce type plutôt qu'un simple pointeur de type int.

  4. #4
    Expert confirmé
    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
    Par défaut
    intptr_t est un type entier signé optionnel pouvant représenter une adresse. Cela signifie uniquement qu'on peut convertir une adresse void * en intptr_t et que si on convertit la valeur ainsi obtenue en void *, on retrouve une adresse égale à l'adresse void * d'origine.
    Si ce type existe, seul ce comportement lors de conversions vers ou depuis un void* est défini par la norme C99.

    uintptr_t est la version entier non signé.

    cf n1256 7.18.1.4 Integer types capable of holding object pointers

  5. #5
    Expert confirmé
    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
    Par défaut
    Donc théoriquement, à l'aide ta réponse, je visualise mieux le principe, mais en pratique, j'ai plus de mal à cerner l'utilisation de ce type plutôt qu'un simple pointeur de type int
    Plutôt des void*.

    - Je ne peux répondre à ta question, vu que je ne vois pas d'utilité à "stocker" une adresse dans un entier.
    - L'utilité ne doit pas être flagrante, sinon ces types ne seraient pas optionnels.
    - La portabilité est douteuse puisque le comportement des conversions pointeurs <-> entiers donne un résultat dépendant de l'implémentation.
    cf n1256 6.3.2.3 Pointers §5 et §6

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Par défaut
    Merci Diogene pour tes deux réponses!

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Quelqu'un as-t-il un exemple de cas d'utilisation de ce type intptr_t. Autant je comprends l'utilité de ptrdiff_t, autant l'utilité de intptr_t m'échappe.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/11/2011, 07h25
  2. [JavaScript] Tester l'égalité de tableaux pouvant contenir des tableaux
    Par Bovino dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/09/2011, 20h42
  3. Réponses: 2
    Dernier message: 19/01/2011, 13h48
  4. Composant liste pouvant contenir d'autres composants
    Par paf84 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/01/2010, 11h52
  5. [MySQL] Variable pouvant contenir des apostrophes
    Par god_enel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/01/2007, 09h26

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