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 :

Types de données


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Par défaut Types de données
    Bonjour à tous,

    Dans la phrase "lorsque les types sont définis par forçage, tout ce qui est suffisamment grand pour contenir une valeure sur 4 octets peut jouer le role de pointeur non typé".

    Qu'est-ce qui est " suffisamment grand " ?
    Et type de valeure (adresse mem ou type de donné entier, craractère)?

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Salut,

    ça voudrait dire qu'un pointeur tient sur 4 octets, et ça me parait au moins faux. C'est certainement vrai sur les systèmes 32bits, et dans les programmes compilés en 32 bits, plus vraiment avec des programmes compilés en 64 bits où un pointeur peut s'étendre sur 8 octets.
    D'où que tu sortes cette affirmation, tu peux probablement considérer cette source fausse.
    Les seuls types sûrs pour contenir un pointeur quelconque sont std::intptr_t ou std::uintptr_t définis dans cstdint et void*.
    Et bien sûr il est toujours mieux d'avoir des pointeurs typés.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Un code comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float valeur = 42;
    float* pointeur = &valeur;
    int adresse = (int) &valeur;
    En partant du principe que sizeof(float*) <= sizeof(int), tu peux stocker la valeur de 'pointeur' dans 'adresse' (qui est '&valeur'). Ce principe est peut-être faux comme l'explique très bien Bousk. En admettant qu'il soit vrai, 'pointeur' et 'adresse' contient la même chose : l'adresse de 'valeur'. Par contre, 'pointeur' sait que ce qui est pointé est un 'float' (*), contrairement à 'adresse'. Tu as donc bien forcé le type avec le cast (int) et tu te retrouves avec un genre de pointeur non-typé. Ce qui ne sert pas à grand chose... On va préférer utiliser des void* ou intptr_t.

    (*) C'est l'essence même d'un pointeur : son type indique le type pointé, sa valeur donne l'adresse d'un objet de ce type (normalement, mais on peut toujours faire du sale comme ceci : float valeur; int* pointeur = (int*) &valeur; et à ce moment là il y a incohérence entre le type supposé et le type réel de l'objet pointé).

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Bktero Voir le message
    mais on peut toujours faire du sale comme ceci : float valeur; int* pointeur = (float*) &valeur; et à ce moment là il y a incohérence entre le type supposé et le type réel de l'objet pointé).
    Je pense que tu as salement écrit ton sale (est-ce que "non sale" = "propre" ? ). A mon avis, pour faire ce que je crois que tu tentes de faire, tu aurais dû écrire float valeur; int* pointeur = (int*) &valeur;...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    En fait les 2 bouts de code étaient faux... J'ai corrigé.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Par défaut
    Merci ça m'a beaucoup aidé

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    Je passais par là , et je me demande si cela ne pouvait pas être "autre chose", une chose que j'ai vu en embarqué mais je n'en suis pas sûr

    Attention, code qui nécessite de maîtriser le 32/ 64 bits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void one_function(int param) {
        unsigned int id = (unsigned int) param;
    //  or
        char c = (char) param;
    //  char c = (char) param & 0xff;
    //  or
        int* handle = (int*) param;
    //  or
        My_Struct* one_struct = (My_Struct*) param;
    //  or
        float val = (float) param;
    }

  8. #8
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour,
    En langage C/C++, les pointeurs n'ont pas une taille fixe. Tout simplement parce que la taille d'un pointeur dépend de plusieurs choses à commencer par l'architecture de la machine, le système d'exploitation et voir même le compilateur. Cependant, de façon générale, la taille d'un pointeur est égale à la taille d'un mot machine.

    Comme là souligner @Bousk pour un ordinateur 32 bits, la taille du pointeur peut être de 4 octets et pour les ordinateurs 64 bits cela peut être égale 8 octets. Il y a également la situation dans laquelle où l'on trouve un sur une architecture 64 bits un système d'exploitation 32 bits et dans ce cas-là les pointeurs auront une taille non pas égale à l'architecture machine 64 bits mais un mot correspond à une architecture 32 bits (4 octets) parce que le système d'exploitation qui s'exécute sur cette architecture est de 32 bits. Cas contraire (64 bits) , vous aurez une taille de pointeur pouvant s'étendre sur 8 octets.
    Il y a des cas (architecture spécifique) où on peut avoir des pointeurs dont peut importe leur type, ils auront sans exception la même taille sauf les pointeurs de fonction.

    à bientôt

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    En langage C/C++, les pointeurs n'ont pas une taille fixe.
    Le problème, c'est la taille d'un entier
    Sur une plateforme 32 bits, c'est 32 bits (des rares fois c'est 16 bits), un long 32 bits et un long long 64 bits.
    Alors que sur une plateforme 64 bits
    • un entier c'est soit 32 bits (LLP64 ou LP64) soit 64 bits (ILP64 ou SILP64)
    • un long c'est soit 32 bits (LLP64) soit 64 bits (LP64 ou ILP64 ou SILP64)



    Donc, assumer que la taille d'un entier et/ ou d'un long est la même qu'un pointeur, ne fonctionne que si on n'utilise des compilateurs avec lesquels on maîtrise le 32/ 64 bits.

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

Discussions similaires

  1. interbase : types de donnés : AutoIncrement et Date ???
    Par delphien dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/04/2004, 17h29
  2. Type pour données de type email avec @
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/01/2004, 14h50
  3. Types de données interbase
    Par Clotilde dans le forum InterBase
    Réponses: 2
    Dernier message: 18/11/2003, 14h10
  4. Réponses: 2
    Dernier message: 22/09/2003, 11h23
  5. Convertir un type de donnée sous SQL Server
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2003, 15h15

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