[C] Peut-on conscidèrer ce bout de code correct ?

Peut-on conscidèrer ce bout de code correct ? [C] - C - Programmation

Marsh Posté le 25-07-2003 à 18:00:47    

sous linux, glibc-2.2.x, gcc, bla bla bla ... :
 

Code :
  1. unsigned char get_upper_bit (unsigned short data) {
  2.   char *temp=NULL;
  3.   unsigned char ret;
  4.  
  5.   temp = (char *) &data;
  6.   ret = *temp;
  7.   return ret;
  8. }
  9. unsigned char get_lower_bit (unsigned short data) {
  10.   char *temp=NULL;
  11.   unsigned char ret;
  12.  
  13.   temp = (char *) &data;
  14.   ret = *++temp;
  15.   return ret;
  16. }


 
mon but est de séparer le 1er et le 2ème bit d'un short de manière correct, cad ke ce ke je doit avoir est un octet contenant le 1er bit et un autre octet contenant le 2ème bit, pour pouvoir être envoyer d'en une fonction ki a un prototype de ce genre :

Code :
  1. char ma_fonction (unsigned char data1, unsigned char data2);


 
j'ai bien essayé ça :

Code :
  1. ma_fonction ((unsigned char) mon_short % 256, (unsigned char) mon_short >> 8);


mais ça couille sur le 2ème et me donne data2 = 0 :/
 
alors, mes deux fonctions sont elle "correct" au sens manière d'écrire, transgression de règles, etc ... ?
(le compilo ne fait pas de warning et le resultat est bon)


Message édité par Deadog le 25-07-2003 à 18:05:17
Reply

Marsh Posté le 25-07-2003 à 18:00:47   

Reply

Marsh Posté le 25-07-2003 à 18:28:59    

Code :
  1. unsigned char get_upper_byte(unsigned short data)
  2. {
  3.   return (data >> 8) & 0xFF;
  4. }
  5. unsigned char get_lower_byte(unsigned short data)
  6. {
  7.   return data & 0xFF;
  8. }
  9. #include <stdio.h>
  10. int main(int argc, char **argv)
  11. {
  12.   for( ; argc!=1; --argc)
  13.     {
  14.       short unsigned i;
  15.       if(sscanf(argv[argc-1], "%hu", &i) == 1)
  16. {
  17.   printf("%hu %#0X -> %#0X %#0X\n",
  18.   i,
  19.   i,
  20.   get_upper_byte(i),
  21.   get_lower_byte(i)
  22.   );
  23. }
  24.     }
  25.   return 0;
  26. }

moi je verrais plutot ça, qui doi fonctionner sur une machine ou un char est codé sur CHAR_BIT == 8 et où un sizeof(unsigned short) >= 2

Reply

Marsh Posté le 25-07-2003 à 18:30:03    

Bon alors c pas des bits que tu veux récupérer mais des byte
 
Et tes fonctions sont à chier:
 
 

Code :
  1. unsigned char highOrder(unsigned short s)
  2. {
  3.    return (unsigned char)(s >> 8);
  4. }
  5. unsigned char lowOrder(unsigned short s)
  6. {
  7.    return (unsigned char)s;
  8. }


 
Pas la peine de se compliquer la vie  :whistle:


Message édité par LetoII le 25-07-2003 à 18:34:06

---------------
Le Tyran
Reply

Marsh Posté le 25-07-2003 à 18:34:46    

++Taz a écrit :

Code :
  1. unsigned char get_upper_byte(unsigned short data)
  2. {
  3.   return (data >> 8) & 0xFF;
  4. }
  5. unsigned char get_lower_byte(unsigned short data)
  6. {
  7.   return data & 0xFF;
  8. }
  9. #include <stdio.h>
  10. int main(int argc, char **argv)
  11. {
  12.   for( ; argc!=1; --argc)
  13.     {
  14.       short unsigned i;
  15.       if(sscanf(argv[argc-1], "%hu", &i) == 1)
  16. {
  17.   printf("%hu %#0X -> %#0X %#0X\n",
  18.   i,
  19.   i,
  20.   get_upper_byte(i),
  21.   get_lower_byte(i)
  22.   );
  23. }
  24.     }
  25.   return 0;
  26. }

moi je verrais plutot ça, qui doi fonctionner sur une machine ou un char est codé sur CHAR_BIT == 8 et où un sizeof(unsigned short) >= 2


 
Juste par curiosité, y a beaucoup de machine qui code le char sur plus d'un octet?


---------------
Le Tyran
Reply

Marsh Posté le 25-07-2003 à 18:39:52    

pas vraiment dans le monde du PC, mais y a beaucoup de processeur RISC industriel ou les char sont sur 16bits voir 32bits. enfin, c'est plus courant qu'on ne le pense. il y avait aussi des architecture avec des char sur 8/10bits. Autant prendre une bonne habitude, deplus on ne sait jamais sur quelle machine tournera son code, et puis la macro CHAR_BIT est bien plus élégante des nombres magiques comme 8, etc...

Reply

Marsh Posté le 25-07-2003 à 18:42:11    

++Taz a écrit :

pas vraiment dans le monde du PC, mais y a beaucoup de processeur RISC industriel ou les char sont sur 16bits voir 32bits. enfin, c'est plus courant qu'on ne le pense. il y avait aussi des architecture avec des char sur 8/10bits. Autant prendre une bonne habitude, deplus on ne sait jamais sur quelle machine tournera son code, et puis la macro CHAR_BIT est bien plus élégante des nombres magiques comme 8, etc...


 
Tout à fait d'accord avec toi. Mais, tout en sachant que ça pouvait exister je conaissais pas d machines ou le char faisait pas 8 bits.


---------------
Le Tyran
Reply

Marsh Posté le 25-07-2003 à 18:47:07    

ah oui, tiens, j'me susi confondu sur le byte, surement le manque de sommeil :sleep:  
 
merci, m'enfin ça me parait assez bizarre de faire des changements de cast comme ça :heink:

Reply

Marsh Posté le 25-07-2003 à 18:48:39    

cela dit un byte doit etre traduit par multiplet ou plus-petite-unité-adressable, c'est ce sens qu'utilise le C.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed