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 :

Que veut dire int nVal:1 dans une struct


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut Que veut dire int nVal:1 dans une struct
    Bonjour,

    En étudiant un code j'ai trouvé dans une déclaration de struct une déclaration de variable de cette forme : int nVal:1 qu'est-ce que cela peut bien vouloir dire ? Est-ce une initialisation ?

    Ex. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct SMyStruct{
    int nVal:1;
    };
    Merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    C'est pour spécifier le nombre de bits (cela ne fonctionne qu'avec une structure)

    Donc dans ton cas, cela semble vouloir dire que l'on veut un booléen

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Donc dans ton cas, cela semble vouloir dire que l'on veut un booléen
    Ou alors c'est un qbit qui peut valoir à la fois 0 ou 1...
    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]

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    un entier signé sur un seul bit, je dirais plutôt qu'il peut contenir les valeurs -1 et 0.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Apprenti informaticien à l'ETML
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprenti informaticien à l'ETML

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est pour spécifier le nombre de bits (cela ne fonctionne qu'avec une structure)

    Donc dans ton cas, cela semble vouloir dire que l'on veut un booléen
    Du coup, est-ce que ça ne fait que limiter le nombre de valeurs possibles ou bien cela va-t-il également optimiser l'allocation de la mémoire en n'allouant que 1 seul bit ? (ce qui me semble impossible vu qu'une adresse mémoire correspond à un byte)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Raynobrak Voir le message
    Du coup, est-ce que ça ne fait que limiter le nombre de valeurs possibles ou bien cela va-t-il également optimiser l'allocation de la mémoire en n'allouant que 1 seul bit ?
    Je ne suis pas expert de cette fonctionnalité, et je ne l'ai jamais utilisée

    Mais je dirais que cela optimise l'empaquetage des données dans la structure
    Parce que lorsque tu accèdes à un membre de ta structure (XXX.member) c'est juste un décalage d'adresse par rapport au début.

    Donc, je pense que pour que cette fonctionnalité soit efficace, il faut les enchainer pour arriver à 8 bits (pour découper les octets de ta structure)
    Ensuite je ne sais pas ce qui se passe lorsqu'il y a découpage d'octets et alignement de ta structure en même temps cela va fonctionner évidemment, mais est-ce que ton optimisation aura un effet positif

    En état actuel, cela ne sert à rien je pense que le compilateur va allouer soit un int soit un unsigned char (parce qu'il s'aperçoit qu'1 seul bit est nécessaire sur les 16/ 32/ 64 bits)


    Citation Envoyé par Raynobrak Voir le message
    ce qui me semble impossible vu qu'une adresse mémoire correspond à un byte
    Tu as le même ordinateur que @Sve@r : avec un processeur 8 bits ou peut-être quantique

    Une adresse c'est soit 4 soit 8 octets

  7. #7
    Membre à l'essai
    Homme Profil pro
    Apprenti informaticien à l'ETML
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprenti informaticien à l'ETML

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par foetus Voir le message
    Je ne suis pas expert de cette fonctionnalité, et je ne l'ai jamais utilisée


    Une adresse c'est soit 4 soit 8 octets
    Je me suis mal exprimé, quand j'ai dit qu'une adresse correspondait à un byte, je voulais dire que chaque adresse marque le début d'un byte (que chaque byte de la mémoire à sa propre adresse). Je ne parlais pas de la taille d'un pointeur.

    Merci de ta réponse !

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    int nVal:1 qu'est-ce que cela peut bien vouloir dire ? Est-ce une initialisation ?
    Ce type de déclaration est un champ de bits :
    - https://c.developpez.com/cours/berna...gne/node91.php
    - https://www.tutorialspoint.com/cprog...g/c_bit_fields

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Merci à tous pour vos réponses.

    Je mets en résolu.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    un entier signé sur un seul bit, je dirais plutôt qu'il peut contenir les valeurs -1 et 0.
    Ah non, là pas possible. Dans les entiers signés, le signe occupe déjà un bit. Tu ne peux donc pas coder "-1" sur un seul bit...
    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]

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Bon après vérification je n'ai pas trop dit de bêtises.

    Cette fonctionnalité ne fonctionne qu'avec certains types (insigned int, signed int, ou _Bool ( C99 )), n'a comme valeur une valeur entre 0 et 7 (compris) et cela permet d'aligner des membres sur 8 ou 16 bits (1 word)
    On ne peut pas prendre l'adresse d'un tel membre.

    Et la valeur 0 est une valeur particulière : elle permet de passer à l'octet suivant.

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir à tous

    Il y a près de 15 ans j'étais sur les DSP TI dans le cadre de mes études, et tous les registres I/O étaient défini de la sorte dans un union.
    Terriblement pratique pour avoir un code des plus lisible ! Tout le travail de masquage pour accéder à un bit ou une série de bits est fait par le compilateur, fini la corvée manuelle. A un point que j'hésite à réécrire les .h des AVR que j'utilise de la sorte.

    Citation Envoyé par Sve@r Voir le message
    Ah non, là pas possible. Dans les entiers signés, le signe occupe déjà un bit. Tu ne peux donc pas coder "-1" sur un seul bit...
    Il faut réviser son algèbre de Bool!
    En notation au complément à 2, le bit de poids fort vaut moins sa valeur:
    8 bits: -1signé = 1111 1111base 2 = -128 + 127
    7 bits: -1signé = 111 1111base 2 = -64 + 63
    6 bits: -1signé = 11 1111base 2 = -32 + 31
    5 bits: -1signé = 1 1111base 2 = -16 + 15
    4 bits: -1signé = 1111base 2 = -8 + 7
    3 bits: -1signé = 111base 2 = -4 + 3
    2 bits: -1signé = 11base 2 = -2 + 1
    et donc
    1 bit: -1signé = 1base 2 = -1 + 0

    Bonne soirée

    Delias

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Delias Voir le message
    Il faut réviser son algèbre de Boole!
    Et aussi l'orthographe des précurseurs de l'informatique. Mais tu as raison. Avec un bit qui sert alors de bit de signe et pas de valeur on code en effet 0 ou -1.
    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]

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Merci à tous le monde pour vos réponses.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/08/2008, 17h07
  2. Que veut dire les + dans une table?
    Par La Zélie dans le forum Modélisation
    Réponses: 2
    Dernier message: 01/02/2008, 15h06
  3. Réponses: 4
    Dernier message: 23/11/2006, 22h05
  4. Que veut dire : dans un constructeur?
    Par Jean_Benoit dans le forum C++
    Réponses: 5
    Dernier message: 19/10/2006, 16h20
  5. Que veut dire "volatile" devant une variable ?
    Par altahir007 dans le forum C
    Réponses: 4
    Dernier message: 23/06/2004, 15h47

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