Ecrire un nombre dans un seul octet ?

Ecrire un nombre dans un seul octet ? - C - Programmation

Marsh Posté le 27-02-2005 à 23:09:25    

Bonjour,  
 
Je cherche à écrire un nombre (qui ne dépassera pas 255) dans un octet... Le type de codage le plus petit en C pour un nombre, c'est le "short" à ma connaissance, mais il prend 2 octets en mémoire...
 
Une idée ?


Message édité par Froozen le 27-02-2005 à 23:09:35
Reply

Marsh Posté le 27-02-2005 à 23:09:25   

Reply

Marsh Posté le 27-02-2005 à 23:09:46    

char
 
edit: notons qu'en C un char à toujours une longueur d'un byte, mais qu'un byte ne fait pas toujours un octet :o </pedantic>


Message édité par Pillow le 27-02-2005 à 23:11:15
Reply

Marsh Posté le 27-02-2005 à 23:12:34    

Hum je viens de penser à quelque chose : sachant qu'un char est codé sur 1 octet (à confirmer tout de même), avec un memcpy ça passerait ?
 
Exemple :

Code :
  1. short nombre=255;
  2. char caractere[1];
  3. memcpy(&caractere, &nombre, 1);

Reply

Marsh Posté le 27-02-2005 à 23:12:59    

Pillow a écrit :

char
 
edit: notons qu'en C un char à toujours une longueur d'un byte, mais qu'un byte ne fait pas toujours un octet :o </pedantic>


Merci ça confirme donc mon idée  [:dawa]
 
EDIT : dans la majeure partie des cas c'est bien un octet ?


Message édité par Froozen le 27-02-2005 à 23:14:52
Reply

Marsh Posté le 27-02-2005 à 23:13:12    

faudrait que je revois mon vocabulaire moi !!
 
octet n'est pas la traduction francaise de byte ??


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-02-2005 à 23:13:41    

Froozen a écrit :

Hum je viens de penser à quelque chose : sachant qu'un char est codé sur 1 octet (à confirmer tout de même), avec un memcpy ça passerait ?
 
Exemple :

Code :
  1. short nombre=255;
  2. char caractere[1];
  3. memcpy(&caractere, &nombre, 1);



char nombre;
nombre = 255;
 
?


---------------
[:whatde]
Reply

Marsh Posté le 27-02-2005 à 23:14:37    

taz va faire une attaque :D


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-02-2005 à 23:15:32    

WhatDe a écrit :

char nombre;
nombre = 255;
 
?


 
si char fait bien 8 bits, tu vas l'avoir dans le cultre [:petrus75]
 
unsigned char nombre = 255;
 
félicitation a Froozen au passage, jamais vu un code si compliqué (par ailleurs buggé)pour faire une pauvre assignation :d

Reply

Marsh Posté le 27-02-2005 à 23:24:12    

chrisbk a écrit :

si char fait bien 8 bits, tu vas l'avoir dans le cultre [:petrus75]
 
unsigned char nombre = 255;
 
félicitation a Froozen au passage, jamais vu un code si compliqué (par ailleurs buggé)pour faire une pauvre assignation :d


J'aime bien ce forum, on se demande l'utilité de poser une question si c'est pour se faire démonter à chaque faute. Excusez-moi de vous avoir dérangés ô maitres de la programmation.
 
Par ailleurs j'ai eu ma réponse de manière beaucoup plus agréable sur un IRC, il suffisait donc de déclarer un unsigned char et d'y affecter directement ma valeur 255.
 
C'est pitoyable vraiment l'ambiance ici...

Reply

Marsh Posté le 27-02-2005 à 23:27:10    

Froozen a écrit :

J'aime bien ce forum, on se demande l'utilité de poser une question si c'est pour se faire démonter à chaque faute. Excusez-moi de vous avoir dérangés ô maitres de la programmation.
 
Par ailleurs j'ai eu ma réponse de manière beaucoup plus agréable sur un IRC, il suffisait donc de déclarer un unsigned char et d'y affecter directement ma valeur 255.
 
C'est pitoyable vraiment l'ambiance ici...


 
Je sais pas si t'as vu, 1) je t'ai fourni ta réponse 2) je t'ai pas insulté, 3) mon ton n'etait pas agressif
 
mais je suppose que ca fait du bien de raler plein pot

Reply

Marsh Posté le 27-02-2005 à 23:27:10   

Reply

Marsh Posté le 27-02-2005 à 23:28:36    

Froozen a écrit :

Je cherche à écrire un nombre (qui ne dépassera pas 255) dans un octet... Le type de codage le plus petit en C pour un nombre, c'est le "short" à ma connaissance, mais il prend 2 octets en mémoire...


Il n'y a pas d'octet en C.
 
Un unsigned char est un entier comme les autres. Le langage C garantit qu'il peut recevoir les valeurs de 0 à 255. Il occupe un byte en mémoire soit au moins 8 bits.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2005 à 23:32:13    

chrisbk a écrit :

Je sais pas si t'as vu, 1) je t'ai fourni ta réponse 2) je t'ai pas insulté, 3) mon ton n'etait pas agressif
 
mais je suppose que ca fait du bien de raler plein pot


Ta remarque t'aurais pu te la garder aussi...

Reply

Marsh Posté le 27-02-2005 à 23:32:17    

Froozen a écrit :

Hum je viens de penser à quelque chose : sachant qu'un char est codé sur 1 octet (à confirmer tout de même), avec un memcpy ça passerait ?
 
Exemple :

Code :
  1. short nombre=255;
  2. char caractere[1];
  3. memcpy(&caractere, &nombre, 1);



Oui, mais c'est une façon compliquée d'écrire  

unsigned char caractere = 255;


c'est toi qui vois...
 
Nota. Un char peut être signé ou non selon l'implémentation. Pour être sûr qu'il soit non signé (et donc qu'il accepte 255), j'ai utilisé unsigned char. Comme ça, c'est portable...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2005 à 23:33:20    

Emmanuel Delahaye a écrit :

Il n'y a pas d'octet en C.
 
Un unsigned char est un entier comme les autres. Le langage C garantit qu'il peut recevoir les valeurs de 0 à 255. Il occupe un byte en mémoire soit au moins 8 bits.


Ok  :jap:

Reply

Marsh Posté le 27-02-2005 à 23:33:23    

Froozen a écrit :

Ta remarque t'aurais pu te la garder aussi...


 
tu t'es senti vexé ? [:icon12]

Reply

Marsh Posté le 27-02-2005 à 23:34:27    

KangOl a écrit :

faudrait que je revois mon vocabulaire moi !!
 
octet n'est pas la traduction francaise de byte ??


Non. En C, le byte (en français 'multiplet', quel vilain mot...) est l'unité d'adressage mémoire. Elle fait au moins 8 bits. Le C garanti qu'un char occupe exactement 1 byte en mémoire.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2005 à 23:36:13    

Emmanuel Delahaye a écrit :

Oui, mais c'est une façon compliquée d'écrire  

unsigned char caractere = 255;


c'est toi qui vois...


Oui Oui, je vais biensûr utiliser la deuxième forme, la première c'était juste pour le principe (je suis plongé dans les chaînes de caractères et les memcpy en ce moment, CQFD).
 
Merci pour les réponses.

Reply

Marsh Posté le 27-02-2005 à 23:36:32    

Froozen a écrit :

Ta remarque t'aurais pu te la garder aussi...


En gros, tu as le droit de te plaindre et les autres celui de fermer leur gueule.. Belle mentalité. T'es sûr que tu veux de l'aide ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2005 à 23:37:21    

Froozen a écrit :

Oui Oui, je vais biensûr utiliser la deuxième forme, la première c'était juste pour le principe (je suis plongé dans les chaînes de caractères et les memcpy en ce moment, CQFD).
 
Merci pour les réponses.


 
pour info, quand meme, ton appel a memcpy est buggé
 

Code :
  1. short nombre=255;
  2. char caractere[1];
  3. memcpy(&caractere, &nombre, 1); // segfault
  4. memcpy(caractere, &nombre, 1); // pas segfault


 

Reply

Marsh Posté le 27-02-2005 à 23:40:24    

chrisbk a écrit :

pour info, quand meme, ton appel a memcpy est buggé
 

Code :
  1. short nombre=255;
  2. char caractere[1];
  3. memcpy(&caractere, &nombre, 1); // segfault
  4. memcpy(caractere, &nombre, 1); // pas segfault



Tu l'as essayé pour dire ça ou t'as une explication à me donner ?

Reply

Marsh Posté le 27-02-2005 à 23:40:30    

docteur es segfault a parlé :D

Reply

Marsh Posté le 27-02-2005 à 23:46:23    

chrisbk a écrit :

pour info, quand meme, ton appel a memcpy est buggé
 

Code :
  1. short nombre=255;
  2. char caractere[1];
  3. memcpy(&caractere, &nombre, 1); // segfault
  4. memcpy(caractere, &nombre, 1); // pas segfault



Dans ce cas précis (memcpy() attend un void*), les deux écritures sont équivallentes. Sticto sensu, l'une n'est pas meilleure que l'autre. En effet, bien que les types soient différents ('char (*)[1]' vs 'char *'), la valeur est la même. Mais par habitude, je préfère la seconde, même dans ce cas là.


Message édité par Emmanuel Delahaye le 27-02-2005 à 23:48:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-02-2005 à 07:51:27    

Emmanuel Delahaye a écrit :

Dans ce cas précis (memcpy() attend un void*), les deux écritures sont équivallentes. Sticto sensu, l'une n'est pas meilleure que l'autre. En effet, bien que les types soient différents ('char (*)[1]' vs 'char *'), la valeur est la même. Mais par habitude, je préfère la seconde, même dans ce cas là.


 
"caractere" équivaut à "&caractere" ?
Je trouve ça étonnant ???
 
Moi j'aurais dit "caractere" equivaut à "&caractere[0]"
???


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 28-02-2005 à 08:57:06    

Emmanuel Delahaye a écrit :

Dans ce cas précis (memcpy() attend un void*), les deux écritures sont équivallentes. Sticto sensu, l'une n'est pas meilleure que l'autre. En effet, bien que les types soient différents ('char (*)[1]' vs 'char *'), la valeur est la même. Mais par habitude, je préfère la seconde, même dans ce cas là.


 
diantre, je mets ca sur le coup de la fatigue, soit de la mienne soit de la tienne, mais pour moi  
 
&caractere != (caractere == &caractere[0])
 

Reply

Marsh Posté le 28-02-2005 à 08:57:48    

Froozen a écrit :

Tu l'as essayé pour dire ça ou t'as une explication à me donner ?


 
non tu penses bien que je suis juste la pour te pourrir l'ambiance et faire de sales remarques

Reply

Marsh Posté le 28-02-2005 à 09:28:36    

oulà, j'ai bien fait de jouer à Warcraft tout le weekend

Reply

Marsh Posté le 28-02-2005 à 09:33:07    

Froozen a écrit :

Tu l'as essayé pour dire ça ou t'as une explication à me donner ?


 
C'est parce que "caractere" est le nom d'un tableau donc la valeur présente dans la variable "caractere" correspond à l'adresse du premier élément du tableau.
Donc "caractere" équivaut à "&caractere[0]"
 
Donc soit tu passes à "memcpy" la valeur "caractere", soit tu lui passes la valeur "&caractere[0]"; tous deux sont des "char*". Mais tu ne lui passes surtout pas "&caractere" qui est l'adresse d'une adresse autrement dit un "char **"
 
Ou alors tu déclares "caractere" comme un "char" et non comme un  
"char[1]" (parce que déclarer un tableau d'un seul élément c'est pas trop utile) et tu peux écrire ton "memcpy" comme tu l'avais écrit (si tu tiens réellement à utiliser "memcpy" )

Reply

Marsh Posté le 28-02-2005 à 10:06:25    

Sve@r a écrit :

"caractere" équivaut à "&caractere" ?
Je trouve ça étonnant ???


Je confirme. C'est la même valeur, mais pas le même type.


#include <stdlib.h>
#include <stdio.h>
 
int main (void)
{
   char s[1];
 
   char *pa = s;                /* correct */
   char *pb = &s;               /* incorrect */
   char **pc = &s;              /* incorrect */
   char (*pd)[1] = &s;          /* correct */
 
#define PRT(exp) \
   printf ("%10s = %p\n", #exp, (void *) exp)
 
   PRT (s);
   PRT (s + 0);
   PRT (&s[0]);
   PRT (&s);
 
   system ("pause" );
 
   return 0;
}


 
gcc:


main.c: In function `main':
main.c:9: warning: initialization from incompatible pointer type
main.c:10: warning: initialization from incompatible pointer type


 


         s = 0073FDF3
       s+0 = 0073FDF3
     &s[0] = 0073FDF3
        &s = 0073FDF3
Appuyez sur une touche pour continuer . . .
 


Citation :


Moi j'aurais dit "caractere" equivaut à "&caractere[0]"
???


C'est égal : même valeur, même type.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-02-2005 à 10:16:57    

Sve@r a écrit :

C'est parce que "caractere" est le nom d'un tableau donc la valeur présente dans la variable "caractere" correspond à l'adresse du premier élément du tableau.
Donc "caractere" équivaut à "&caractere[0]"


Exact. Même valeur, même type (adresse d'un char soit char *).

Citation :


Donc soit tu passes à "memcpy" la valeur "caractere", soit tu lui passes la valeur "&caractere[0]"; tous deux sont des "char*". Mais tu ne lui passes surtout pas "&caractere" qui est l'adresse d'une adresse autrement dit un "char **"


Non. Tu confonds tableau et pointeur. Dans l'expression  

char caractere[1]


'caractere' n'est pas un pointeur mais un tableau. &caractère est donc l'adresse d'un tableau de 1 caractère, et son type est char (*)[1] et non char** (ce serait le type de l'adresse d'un pointeur sur char). Je sais que beaucoup ont du mal à le croire, mais un tableau et un pointeur sont des choses différentes.
 
Les valeurs de 'caractere' et de &caractere sont identiques parce que la norme dit que le premier élément d'un tableau se situe à l'adresse de celui-ci, donc
 
caractere + 0 == &caractere[0]
 
mais les types sont differents, comme je l'ai démontré.
 
Ce sujet a été épuisé ad nauseam sur les forums de référence du C que sont news:comp.lang.c et news:fr.comp.lang.c (pour la partie francophone). Il est donc inutile de polémiquer. Il suffit de lire leurs archives, et notamment les contributions de Chris Torek ou Horst Kramer.
 
Je ne fais que synthétiser leur propos (mais c'est vrai que j'ai mis du temps à comprendre, comme tout soi-disant programmeur C... mal formé).


Message édité par Emmanuel Delahaye le 28-02-2005 à 10:18:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-02-2005 à 10:20:40    

oué en fait si on se fait un pety dessin avec la stack frame alors c'est logique [:klem3i1]

Reply

Marsh Posté le 28-02-2005 à 10:24:09    

chrisbk a écrit :

non tu penses bien que je suis juste la pour te pourrir l'ambiance et faire de sales remarques

Je demandais si tu l'avais simplement essayé ou si tu pouvais en plus m'expliquer pourquoi il y avait cette erreur  :sarcastic:  

Reply

Marsh Posté le 28-02-2005 à 10:25:01    

Froozen a écrit :

Je demandais si tu l'avais simplement essayé ou si tu pouvais en plus m'expliquer pourquoi il y avait cette erreur  :sarcastic:


 
bin vu comment tu reagis quand on te dis des trucs, ca me donne pas envie de me lancer dans de grandes explications

Reply

Marsh Posté le 28-02-2005 à 10:28:05    

Sinon merci pour vos nombreuses réponses :jap:

Reply

Marsh Posté le 28-02-2005 à 10:28:33    

chrisbk a écrit :

bin vu comment tu reagis quand on te dis des trucs, ca me donne pas envie de me lancer dans de grandes explications

Te fatigue pas va, d'autres l'ont fait à ta place.

Reply

Marsh Posté le 28-02-2005 à 13:00:32    

Emmanuel Delahaye a écrit :

Exact. Même valeur, même type (adresse d'un char soit char *).

Citation :


Donc soit tu passes à "memcpy" la valeur "caractere", soit tu lui passes la valeur "&caractere[0]"; tous deux sont des "char*". Mais tu ne lui passes surtout pas "&caractere" qui est l'adresse d'une adresse autrement dit un "char **"


Non. Tu confonds tableau et pointeur. Dans l'expression  

char caractere[1]


'caractere' n'est pas un pointeur mais un tableau. &caractère est donc l'adresse d'un tableau de 1 caractère, et son type est char (*)[1] et non char** (ce serait le type de l'adresse d'un pointeur sur char). Je sais que beaucoup ont du mal à le croire, mais un tableau et un pointeur sont des choses différentes.
 
Les valeurs de 'caractere' et de &caractere sont identiques parce que la norme dit que le premier élément d'un tableau se situe à l'adresse de celui-ci, donc
 
caractere + 0 == &caractere[0]
 
mais les types sont differents, comme je l'ai démontré.
 
Ce sujet a été épuisé ad nauseam sur les forums de référence du C que sont news:comp.lang.c et news:fr.comp.lang.c (pour la partie francophone). Il est donc inutile de polémiquer. Il suffit de lire leurs archives, et notamment les contributions de Chris Torek ou Horst Kramer.
 
Je ne fais que synthétiser leur propos (mais c'est vrai que j'ai mis du temps à comprendre, comme tout soi-disant programmeur C... mal formé).


 
Je suis en train de lire les FAQ http://www.isty-info.uvsq.fr/~rumeau/fclc. Et j'ai même vu ton nom dans la liste des contributions... :bounce:  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 28-02-2005 à 13:03:13    

on voit meme Emmanuel Delahaye figurer aux cotés de Gabriel Dos Reis :jap:


Message édité par ++fab le 28-02-2005 à 13:04:38
Reply

Marsh Posté le 28-02-2005 à 15:13:06    

++fab a écrit :

on voit meme Emmanuel Delahaye figurer aux cotés de Gabriel Dos Reis :jap:


En général c'est pour me faire rotir...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-03-2005 à 10:15:26    

c'est déjà une performance de pas se faire manger tout cru :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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