Le bidule 'short', c'est pas portable (couic). Non, pas portable, c'est volontaire :
assert(CHAR_BIT == 8); assert(sizeof(short) == 2); En fait, le seul but du bidule 'short' était de montrer le boutisme (oui, je faisais un pari sur la machine de l'OP).
Pourquoi tous ces cast? C'est pas plus simple de mettre le bon type ? Ces fonctions sont dans mon idée et leur nom le montre destinées à
examiner une zone mémoire (qui peut être une simple variable). J'en ai d'ailleurs un petit toolkit plus complet qui remplit bien son rôle pédagogique. Elle attend donc une adresse et une taille. Ce qui représente le mieux une adresse en C, c'est le void*. En fait, j'ai hésité entre ce void* qui complique un peu le code de la fonction, mais pas trop, il suffit de char* ptr = (char*)bouffeur; une fois, et un truc genre BYTE* (j'élimine le char*). J'ai choisi le void*.
Il y a une fuite mémoire : C'est clair, j'ai oublié le free(). Pas d'excuses.
-- Pierre
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire :
assert(CHAR_BIT == 8);
assert(sizeof(short) == 2);
En fait, le seul but du bidule 'short' était de montrer le boutisme
(oui, je faisais un pari sur la machine de l'OP).
Pourquoi tous ces cast?
C'est pas plus simple de mettre le bon type ?
Ces fonctions sont dans mon idée et leur nom le montre destinées à
examiner une zone mémoire (qui peut être une simple variable). J'en ai
d'ailleurs un petit toolkit plus complet qui remplit bien son rôle
pédagogique.
Elle attend donc une adresse et une taille. Ce qui représente le mieux
une adresse en C, c'est le void*. En fait, j'ai hésité entre ce void*
qui complique un peu le code de la fonction, mais pas trop, il suffit de
char* ptr = (char*)bouffeur;
une fois, et un truc genre BYTE* (j'élimine le char*).
J'ai choisi le void*.
Il y a une fuite mémoire :
C'est clair, j'ai oublié le free(). Pas d'excuses.
Le bidule 'short', c'est pas portable (couic). Non, pas portable, c'est volontaire :
assert(CHAR_BIT == 8); assert(sizeof(short) == 2); En fait, le seul but du bidule 'short' était de montrer le boutisme (oui, je faisais un pari sur la machine de l'OP).
Pourquoi tous ces cast? C'est pas plus simple de mettre le bon type ? Ces fonctions sont dans mon idée et leur nom le montre destinées à
examiner une zone mémoire (qui peut être une simple variable). J'en ai d'ailleurs un petit toolkit plus complet qui remplit bien son rôle pédagogique. Elle attend donc une adresse et une taille. Ce qui représente le mieux une adresse en C, c'est le void*. En fait, j'ai hésité entre ce void* qui complique un peu le code de la fonction, mais pas trop, il suffit de char* ptr = (char*)bouffeur; une fois, et un truc genre BYTE* (j'élimine le char*). J'ai choisi le void*.
Il y a une fuite mémoire : C'est clair, j'ai oublié le free(). Pas d'excuses.
-- Pierre
Marc Boyer
James Kanze wrote:
Dans une documentation C ? Les pages de man (Unix) % man -s3C printf % man -a printf
Ce qui ne donne pas forcement la documentation du printf de C. (Au moins sur mon Unix, printf accepte des spécifications de formattage du genre "%2$s" ; ce n'est pas du standard C.)
Une *bonne* documentation signalerait ce qui est standard et ce qui ne l'est pas, mais on ne choisit pas toujours sa documentation en ligne.
Un bouquin de C J'ai longtemps utilisé le célèbre K&R Mais actuellement, c'est ``C: a reference manual'', Samuel P. Harbision et Guy L. Steele
Pour la bibliothèque aussi ?
Oui. Par exemple, on trouve 22 pages sur les E/S formatées. Ca peut paraître beaucoup, mais quand on a tenté de lire le tableau résumé du K&R, on apprécie de trouver les détails.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
James Kanze wrote:
Dans une documentation C ?
Les pages de man (Unix)
% man -s3C printf
% man -a printf
Ce qui ne donne pas forcement la documentation du printf de C.
(Au moins sur mon Unix, printf accepte des spécifications de
formattage du genre "%2$s" ; ce n'est pas du standard C.)
Une *bonne* documentation signalerait ce qui est
standard et ce qui ne l'est pas, mais on ne choisit
pas toujours sa documentation en ligne.
Un bouquin de C
J'ai longtemps utilisé le célèbre K&R
Mais actuellement, c'est ``C: a reference manual'', Samuel
P. Harbision et Guy L. Steele
Pour la bibliothèque aussi ?
Oui. Par exemple, on trouve 22 pages sur les E/S formatées.
Ca peut paraître beaucoup, mais quand on a tenté de lire
le tableau résumé du K&R, on apprécie de trouver les détails.
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
Dans une documentation C ? Les pages de man (Unix) % man -s3C printf % man -a printf
Ce qui ne donne pas forcement la documentation du printf de C. (Au moins sur mon Unix, printf accepte des spécifications de formattage du genre "%2$s" ; ce n'est pas du standard C.)
Une *bonne* documentation signalerait ce qui est standard et ce qui ne l'est pas, mais on ne choisit pas toujours sa documentation en ligne.
Un bouquin de C J'ai longtemps utilisé le célèbre K&R Mais actuellement, c'est ``C: a reference manual'', Samuel P. Harbision et Guy L. Steele
Pour la bibliothèque aussi ?
Oui. Par exemple, on trouve 22 pages sur les E/S formatées. Ca peut paraître beaucoup, mais quand on a tenté de lire le tableau résumé du K&R, on apprécie de trouver les détails.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Yves ROMAN
Salut,
Quel est le masque à utiliser pour printer une chaine en hexa dans un fichier ? [...]
Ca serait pas plutot unsigned char* ptr = (unsigned char*)bouffeur; pour éviter les surprises en cas de valeurs négatives ? (a moins que sur ton compilateur le char soit unsigned par defaut)
Ca serait pas plutot
unsigned char* ptr = (unsigned char*)bouffeur;
pour éviter les surprises en cas de valeurs négatives ?
(a moins que sur ton compilateur le char soit unsigned par defaut)
Ca serait pas plutot unsigned char* ptr = (unsigned char*)bouffeur; pour éviter les surprises en cas de valeurs négatives ? (a moins que sur ton compilateur le char soit unsigned par defaut)
Ca serait pas plutot unsigned char* ptr = (unsigned char*)bouffeur; pour éviter les surprises en cas de valeurs négatives ? (a moins que sur ton compilateur le char soit unsigned par defaut) Bonne question. Vous avez raison.
Le but est d'examiner la mémoire.
* Si je veux l'afficher en décimal (%d), je suis obligé de préciser ma demande et de spécifier 'signed char' ou 'unsigned char', 'char' étant ambigu. Je mettrais si possible quelque chose comme int8_t ou uint8_t (et même typedefer un sint8_t équivalent au int8_t).
* Mais je veux afficher en hexa. Dans mon idée, le spécificateur x ou X affiche en 'unsigned int' donc une image bit à bit de la donnée. Mais effectivement, la conversion en int et le fait que %02X ne tronque pas m'avaient échappé et je n'avais pas fait de tests. Donc, pour éviter d'afficher des FFFFFFD4, il faut spécifier 'unsigned char'. J'aurais préféré régler le problème au niveau du printf(), mais je n'ai pas trouvé. -- Pierre
Ca serait pas plutot
unsigned char* ptr = (unsigned char*)bouffeur;
pour éviter les surprises en cas de valeurs négatives ?
(a moins que sur ton compilateur le char soit unsigned par defaut)
Bonne question. Vous avez raison.
Le but est d'examiner la mémoire.
* Si je veux l'afficher en décimal (%d), je suis obligé de préciser ma
demande et de spécifier 'signed char' ou 'unsigned char', 'char' étant
ambigu. Je mettrais si possible quelque chose comme int8_t ou uint8_t
(et même typedefer un sint8_t équivalent au int8_t).
* Mais je veux afficher en hexa. Dans mon idée, le spécificateur x ou X
affiche en 'unsigned int' donc une image bit à bit de la donnée. Mais
effectivement, la conversion en int et le fait que %02X ne tronque pas
m'avaient échappé et je n'avais pas fait de tests. Donc, pour éviter
d'afficher des FFFFFFD4, il faut spécifier 'unsigned char'. J'aurais
préféré régler le problème au niveau du printf(), mais je n'ai pas trouvé.
--
Pierre
Ca serait pas plutot unsigned char* ptr = (unsigned char*)bouffeur; pour éviter les surprises en cas de valeurs négatives ? (a moins que sur ton compilateur le char soit unsigned par defaut) Bonne question. Vous avez raison.
Le but est d'examiner la mémoire.
* Si je veux l'afficher en décimal (%d), je suis obligé de préciser ma demande et de spécifier 'signed char' ou 'unsigned char', 'char' étant ambigu. Je mettrais si possible quelque chose comme int8_t ou uint8_t (et même typedefer un sint8_t équivalent au int8_t).
* Mais je veux afficher en hexa. Dans mon idée, le spécificateur x ou X affiche en 'unsigned int' donc une image bit à bit de la donnée. Mais effectivement, la conversion en int et le fait que %02X ne tronque pas m'avaient échappé et je n'avais pas fait de tests. Donc, pour éviter d'afficher des FFFFFFD4, il faut spécifier 'unsigned char'. J'aurais préféré régler le problème au niveau du printf(), mais je n'ai pas trouvé. -- Pierre
Antoine Leca
En news:424b0d16$0$11793$, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic). Non, pas portable, c'est volontaire :
Pas suffisant: tu peux avoir des machines où le short négatif qui "correspond" à zéro est une représentation piégée -- normalement, -32768 en complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en magnitude signée (0x8000).
Antoine
En news:424b0d16$0$11793$626a14ce@news.free.fr, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire :
Pas suffisant: tu peux avoir des machines où le short négatif qui
"correspond" à zéro est une représentation piégée -- normalement, -32768 en
complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en
magnitude signée (0x8000).
Pas suffisant: tu peux avoir des machines où le short négatif qui "correspond" à zéro est une représentation piégée -- normalement, -32768 en complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en magnitude signée (0x8000).
Antoine
Francois
Merci pour toutes vos réponses et références !
J'adore comme ce groupe est profilique sur chaque question posée :)
-- Francois.
Merci pour toutes vos réponses et références !
J'adore comme ce groupe est profilique sur chaque question posée :)
J'adore comme ce groupe est profilique sur chaque question posée :)
-- Francois.
Pierre Maurette
En news:424b0d16$0$11793$, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire : assert(CHAR_BIT == 8); assert(sizeof(short) == 2);
Pas suffisant: tu peux avoir des machines où le short négatif qui "correspond" à zéro est une représentation piégée -- normalement, -32768 en complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en magnitude signée (0x8000). Merci.
Normalement, quelqu'un devrait maintenant demander "Ah bon, sur quelle machine etc." ;-) Les assert() dans un code testé/posté/effacé s'adressaient au lecteur, dans le fol espoir d'éviter la remarque de portabilité. J'imagine que pour faire de façon portable le même code il faut une usine à gaz (le seul but de la version short de la fonction étant de mettre en évidence le piège du boutisme s'il est petit). Je devrais utiliser les types de stdint.h. S'ils existent, ils me garantissent pas mal de trucs, non ? MAis le fait qu'ils puissent ne pas exister suffira à faire passer le NG en mode -Wall ;-) J'ai bien pensé précéder toutes mes tentatives de code par: /* Code non-portable. Testé sur .... */ Mais avec la chance que j'ai et mon niveau en C, j'aurai alors droit à "Et en quoi n'est-ce pas portable ?". Reste la solution de ne rien poster, mais l'humanité se remettrait-elle d'une telle perte ? -- Pierre
En news:424b0d16$0$11793$626a14ce@news.free.fr, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire :
assert(CHAR_BIT == 8);
assert(sizeof(short) == 2);
Pas suffisant: tu peux avoir des machines où le short négatif qui
"correspond" à zéro est une représentation piégée -- normalement, -32768 en
complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en
magnitude signée (0x8000).
Merci.
Normalement, quelqu'un devrait maintenant demander "Ah bon, sur quelle
machine etc." ;-)
Les assert() dans un code testé/posté/effacé s'adressaient au lecteur,
dans le fol espoir d'éviter la remarque de portabilité. J'imagine que
pour faire de façon portable le même code il faut une usine à gaz (le
seul but de la version short de la fonction étant de mettre en évidence
le piège du boutisme s'il est petit).
Je devrais utiliser les types de stdint.h. S'ils existent, ils me
garantissent pas mal de trucs, non ? MAis le fait qu'ils puissent ne pas
exister suffira à faire passer le NG en mode -Wall ;-)
J'ai bien pensé précéder toutes mes tentatives de code par:
/* Code non-portable. Testé sur .... */
Mais avec la chance que j'ai et mon niveau en C, j'aurai alors droit à
"Et en quoi n'est-ce pas portable ?".
Reste la solution de ne rien poster, mais l'humanité se remettrait-elle
d'une telle perte ?
--
Pierre
En news:424b0d16$0$11793$, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire : assert(CHAR_BIT == 8); assert(sizeof(short) == 2);
Pas suffisant: tu peux avoir des machines où le short négatif qui "correspond" à zéro est une représentation piégée -- normalement, -32768 en complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en magnitude signée (0x8000). Merci.
Normalement, quelqu'un devrait maintenant demander "Ah bon, sur quelle machine etc." ;-) Les assert() dans un code testé/posté/effacé s'adressaient au lecteur, dans le fol espoir d'éviter la remarque de portabilité. J'imagine que pour faire de façon portable le même code il faut une usine à gaz (le seul but de la version short de la fonction étant de mettre en évidence le piège du boutisme s'il est petit). Je devrais utiliser les types de stdint.h. S'ils existent, ils me garantissent pas mal de trucs, non ? MAis le fait qu'ils puissent ne pas exister suffira à faire passer le NG en mode -Wall ;-) J'ai bien pensé précéder toutes mes tentatives de code par: /* Code non-portable. Testé sur .... */ Mais avec la chance que j'ai et mon niveau en C, j'aurai alors droit à "Et en quoi n'est-ce pas portable ?". Reste la solution de ne rien poster, mais l'humanité se remettrait-elle d'une telle perte ? -- Pierre
Charlie Gordon
"Pierre Maurette" wrote in message news:424ac9d0$0$2853$
Pierre Maurette wrote:
Salut,
Quel est le masque à utiliser pour printer une chaine en hexa dans un fichier ?
Votre question est un peu imprécise. "printer", c'est un néologisme à base de printf() ou c'est pour imprimer sur l'imprimante?
Ne soyez pas trop tatillon, je suis sûr qu'il a voulu dire "displayer". Au Québec, je suppose qu'on doit écrire "écranner", "tubecathodiquer"
étant admis pour déraisons hystériques.
Et pour les plus riches : elcéder et téheffter, voire dévéhir !
Chqrlie.
"Pierre Maurette" <maurettepierre@wanadoo.fr> wrote in message
news:424ac9d0$0$2853$626a14ce@news.free.fr...
Pierre Maurette wrote:
Salut,
Quel est le masque à utiliser pour printer une chaine en hexa dans un
fichier ?
Votre question est un peu imprécise. "printer", c'est un néologisme à
base de printf() ou c'est pour imprimer sur l'imprimante?
Ne soyez pas trop tatillon, je suis sûr qu'il a voulu dire "displayer".
Au Québec, je suppose qu'on doit écrire "écranner", "tubecathodiquer"
étant admis pour déraisons hystériques.
Et pour les plus riches : elcéder et téheffter, voire dévéhir !
Pas suffisant: tu peux avoir des machines où le short négatif qui "correspond" à zéro est une représentation piégée -- normalement, -32768 en complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en magnitude signée (0x8000).
Sans doute, mais peux-tu seulement en citer une ? Ces architectures sont bonnes pour la retraite dans les musées. Si vous en connaissez, faites un geste pour le progrès informatique : débranchez-les !
Chqrlie.
"Antoine Leca" <root@localhost.invalid> wrote in message
news:d2goii$nft$1@shakotay.alphanet.ch...
En news:424b0d16$0$11793$626a14ce@news.free.fr, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire :
Pas suffisant: tu peux avoir des machines où le short négatif qui
"correspond" à zéro est une représentation piégée -- normalement, -32768 en
complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en
magnitude signée (0x8000).
Sans doute, mais peux-tu seulement en citer une ?
Ces architectures sont bonnes pour la retraite dans les musées. Si vous en
connaissez, faites un geste pour le progrès informatique : débranchez-les !
Pas suffisant: tu peux avoir des machines où le short négatif qui "correspond" à zéro est une représentation piégée -- normalement, -32768 en complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en magnitude signée (0x8000).
Sans doute, mais peux-tu seulement en citer une ? Ces architectures sont bonnes pour la retraite dans les musées. Si vous en connaissez, faites un geste pour le progrès informatique : débranchez-les !
Chqrlie.
Hamiral
connaissez, faites un geste pour le progrès informatique : débranchez-les !
Vous avez une drôle de conception du progrès ...
connaissez, faites un geste pour le progrès informatique : débranchez-les !