OVH Cloud OVH Cloud

PB débutant

19 réponses
Avatar
Olivier
Bonjour,

J'ai un petit probleme de comprehension de déclaration de variable dans un
programme en Visual C++.

DWORD dwNameLen : 6

que signifie ": 6" ????

Cordialement,

Olivier

9 réponses

1 2
Avatar
James Kanze
Michel Michaud wrote:

(Pour le reste, il faut simplement savoir que les champs de
bits peuvent probablement simplifier les programmes qui
manipulent des bits, au détriment de faire un programme
vraiment portable.)


Et j'y reviens : où est le problème de portabilité ? Je ne vois
rien qui rendrait un champs de bits moins portable que n'importe
quel type classique, disons int.

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Avatar
James Kanze
Michel Michaud wrote:
Dans le message 423c53f1$0$21961$, James
Michel Michaud wrote:



Dans le message
42388f8b$0$15287$, Olivier




Merci pour vos réponses...
Donc si j'ai bien compris,





struct Machin
{
DWORD Truc : 6, Chose : 26;
};





Signifie que la structure Machin à une taille de DWORD, 4
octets, soit 32 bits et qu'elle est composée de Truc qui
fait 6 bits et Chose qui en fait 26 !!??





Non. Seulement que Truc aura au moins 6 bits utilisables et
Chose en aura au moins 24.




Non. Il est garanti que Truc a exactement 6 bits, et Chose 26.



Je ne suis pas certain que c'est ce que dit la norme (je viens
de relire la norme C, ça ne me semble pas aussi clair). Je
sais évidemment que c'est l'intention.


Je comprends surtout que ma phrase ne semble pas dire
exactement à quoi je pensais (et qui reste peut-être faux...).
Je voulais dire que le compilateur allouera au moins 6 bits
pour que Truc ait bien ses 6 bits utilisables, etc.


Tout à fait.

Dans la mésure que les types sont signés, évidemment, c'est
difficile pour un programme conforme de le savoir, mais s'il
sont unsigned, si Truc vaut 63, ++ Truc vaut 0. Garanti par
la norme.



Oui, je suis parfaitement d'accord.


Et alors ?

Mais il me semble possible que les 6 bits de Truc ne soit ni
complètement à gauche ni complètement à droite de l'espace
alloué.


Et alors ? L'implémentation peut mettre des bits « don't care »
au milieu d'un int, aussi, sans que ce soit un champs de bits.
En quoi est-ce que les champs de bits sont différents.

C'est là que je ne suis pas capable de confirmer en lisant la
norme... Dans mon esprit, si j'ai besoin de manipuler 6 bits
dans quelque chose, je vais le faire avec des décalages et des
masques, car je suis sous l'impression que les champs de bits
ne me garantissent rien. Peut-être que je me trompe, c'est une
vieille idée que j'ai en tête (et comme je ne fais plus
beaucoup de manipulations de bits, elle ne m'a jamais vraiment
dérangée :-)


Si tu as besoin d'une représentation précise, disons pour
transmettre les données sur le reseau, à une autre machine, tu
ne vas pas y arriver avec des champs de bits. Ni avec des int,
tout courts, d'ailleurs. Si tu as besoin d'une représentation
précise, tu vas effectivement l'implémenter à coup des décalages
et des masquages. Exactement comme tu fais pour int, d'ailleurs.

Il n'y aucune garantie en ce concerne la taille de Machin,
mais l'intention est clairement précisée que si la taille
d'un DWORD est 32 bits ou plus, que et Truc et Chose se
trouvent dans le même DWORD.



Oui, on est d'accord sur l'intention. Par contre, sur une
machine bizarre, je crois que le compilateur pourrait allouer
beaucoup plus, par exemple deux mots de 32 bits.


Certainement. Et alors ? Sur au moins une machine encore vendue,
les int ont 36 bits, et non 32. Où est le problème ? Ça fait
partie de la philosophie de base de C++ (et de C), et ça touche
tous les types, non seulement les champs de bits.

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34




Avatar
Fabien LE LEZ
On Sun, 20 Mar 2005 23:39:08 +0100, James Kanze :

Et j'y reviens : où est le problème de portabilité ?


Quand Michel écrivait "les champs de bits peuvent probablement
simplifier les programmes qui manipulent des bits", il est possible
qu'il ait pensé à la même chose que moi :

union
{
unsigned int machin;
struct truc
{
unsigned int bidule: 3;
unsigned int trucmuche: 29;
};
};

pour accéder "facilement" aux trois premiers bits d'un entier, sans
utiliser les opérateurs de bricolage de bits ( >>, &, ...)


--
;-)

Avatar
Michel Michaud
Dans le message 423dfb7b$0$21880$,
Michel Michaud wrote:

(Pour le reste, il faut simplement savoir que les champs de
bits peuvent probablement simplifier les programmes qui
manipulent des bits, au détriment de faire un programme
vraiment portable.)


Et j'y reviens : où est le problème de portabilité ? Je ne vois
rien qui rendrait un champs de bits moins portable que n'importe
quel type classique, disons int.


Pour faire de la manipulation de bits ? Vraiment on ne sait rien
sur les int à ce point ? Par exemple, ne peut-on pas supposer, par
exemple, que ((i & 1) == 0) nous dira si un nombre est pair ?

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Michel Michaud
Dans le message 423dfd5c$0$29138$,
Michel Michaud wrote:
Oui, je suis parfaitement d'accord.


Et alors ?


Et alors tu devrais être content, c'est tout.

Mais il me semble possible que les 6 bits de Truc ne soit ni
complètement à gauche ni complètement à droite de l'espace
alloué.


Et alors ? L'implémentation peut mettre des bits « don't care »
au milieu d'un int, aussi, sans que ce soit un champs de bits.
En quoi est-ce que les champs de bits sont différents.


C'est un point de vue intéressant. Disons que j'ai toujours
pensé que les probabilités étaient meilleures au niveau de la
simple représentation des types de base. Mais tu as sûrement
raison. Dès que j'ai l'occasion de faire de la manipulation de
bits, je tâcherai d'y repenser...

[...]
Certainement. Et alors ? Sur au moins une machine encore vendue,
les int ont 36 bits, et non 32. Où est le problème ?


Il n'y a pas de problème James. À part le fait que tu sembles
t'énerver un peu, ce qui ne te ressemble pas :-)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Michel Michaud
Dans le message ,
Quand Michel écrivait "les champs de bits peuvent probablement
simplifier les programmes qui manipulent des bits", il est possible
qu'il ait pensé à la même chose que moi :

union
{
unsigned int machin;
struct truc
{
unsigned int bidule: 3;
unsigned int trucmuche: 29;
};
};

pour accéder "facilement" aux trois premiers bits d'un entier, sans
utiliser les opérateurs de bricolage de bits ( >>, &, ...)


C'est évidemment à quoi je pensais (en fait, même sans l'union),
mais James nous indique que ce n'est ni moins ni plus portable
que de faire des bricolages de bits. (à moins que je comprenne
mal son message...)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
kanze
Fabien LE LEZ wrote:
On Sun, 20 Mar 2005 23:39:08 +0100, James Kanze :

Et j'y reviens : où est le problème de portabilité ?


Quand Michel écrivait "les champs de bits peuvent probablement
simplifier les programmes qui manipulent des bits", il est
possible qu'il ait pensé à la même chose que moi :

union
{
unsigned int machin;
struct truc
{
unsigned int bidule: 3;
unsigned int trucmuche: 29;
};
};

pour accéder "facilement" aux trois premiers bits d'un entier,
sans utiliser les opérateurs de bricolage de bits ( >>, &,
...)


C'est un comportement indéfini:-). (Mais nous savons tous les
deux, je crois, que ça marche à peu près partout, et que c'est
même assez répandu comme technique.)

Ma véritable objection est autre : quand est-ce qu'on pourrait
vouloir accéder aux trois premiers bits d'un entier ? (Et pour
quelle définition de « premiers » ? Les bits de poids forts, ou
de poids faibles.)

Il y a effectivement quelques rares occasions où de telles
opérations sont éventuellement utiles : je me suis servi dans
l'implémentation de modf, par exemple, et dans une
implémentation de malloc pour des machines avec une mémoire
assez limitées. (Je mettais le flag d'allocation sur le bit de
poids faible de l'adresse du prochain bloc.) Mais ça ne
correspond pas à ce que font les programmeurs la plupart du
temps. (On remarque que les deux fois où moi, j'en ai eu besoin,
se trouvait dans l'implémentation d'une bibliothèque standard
C.)

S'il s'agit de générer des formats externes, il est évident
qu'il faut passer par des décalages et des masquages. Mais ce
n'est pas propre aux champs de bits ; c'est aussi vrai pour un
int tout simple.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Michel Michaud wrote:
Dans le message 423dfb7b$0$21880$,
Michel Michaud wrote:

(Pour le reste, il faut simplement savoir que les champs de
bits peuvent probablement simplifier les programmes qui
manipulent des bits, au détriment de faire un programme
vraiment portable.)


Et j'y reviens : où est le problème de portabilité ? Je ne
vois rien qui rendrait un champs de bits moins portable que
n'importe quel type classique, disons int.


Pour faire de la manipulation de bits ? Vraiment on ne sait
rien sur les int à ce point ? Par exemple, ne peut-on pas
supposer, par exemple, que ((i & 1) == 0) nous dira si un
nombre est pair ?


Oui, parce que la norme garantit le resultat mathématique. Mais
quel rapport avec les champs de bits ? Si tu veux une opération
sur un entier, avec un resultat garanti, tu utilises des
opérateurs mathématiques. Si tu veux donner au compilateur la
possibilité de mettre plusieurs entiers dans un seul mot
machine, en explicitement limitant leur intervale de valeurs, tu
te sers des champs de bits. Ce sont deux choses différentes,
avec deux utilisations différentes. Et tous les deux aussi
portables l'un que l'autre.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
kanze
Michel Michaud wrote:
Dans le message 423dfd5c$0$29138$,
Michel Michaud wrote:
Oui, je suis parfaitement d'accord.


Et alors ?


Et alors tu devrais être content, c'est tout.

Mais il me semble possible que les 6 bits de Truc ne soit
ni complètement à gauche ni complètement à droite de
l'espace alloué.


Et alors ? L'implémentation peut mettre des bits « don't
care » au milieu d'un int, aussi, sans que ce soit un champs
de bits. En quoi est-ce que les champs de bits sont
différents.


C'est un point de vue intéressant.


C'est plus qu'un point de vue. Comment ferais-tu autrement sur
un Unisys Series A (qui n'est plus vendu, mais qui était encore
au catalogue il y a quelques années) ? Au niveau du hardware,
tous les mots étaient 48 bits, mais dans un entier, 7 de ces
bits ne servaient pas. Je n'ai jamais eu l'occasion de
travailler sur la bête, mais ça aurait dû être amusant.
sizeof(int) == 6, des bits dans un int qui ne servait pas (et
qui devait obligatoirement être 0, je crois -- sinon, le
hardware le prenait pour un virgule flottant), magnitude
signé...

Disons que j'ai toujours pensé que les probabilités étaient
meilleures au niveau de la simple représentation des types de
base. Mais tu as sûrement raison. Dès que j'ai l'occasion de
faire de la manipulation de bits, je tâcherai d'y repenser...

[...]
Certainement. Et alors ? Sur au moins une machine encore
vendue, les int ont 36 bits, et non 32. Où est le problème ?


Il n'y a pas de problème James. À part le fait que tu sembles
t'énerver un peu, ce qui ne te ressemble pas :-)


Je m'excuse. Il faut dire que je viens de passer trois semaines
assez dûres -- un type a quitté une semaine avant qu'on devait
livrer, et vue que je n'étais pas en surcharge, j'ai dû le
remplacer le pied levé. Sans savoir d'avance même ce que devait
faire le programme (qui évidemment ne marchait pas).

Du coup, je me suis disputé aussi avec ma femme. (C'est
normal -- je rentrais crévé, sans l'énergie de m'occuper un peu
des enfants. Ce qui ne l'était pas pour lui plaire, étant donné
qu'elle s'en était occupé toute la journée.)

Enfin, j'ai livré vendredi, je me suis expliqué avec ma femme ce
week-end, et c'est à espérer que les choses vont mieux cette
semaine:-).

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



1 2