Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1529 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Ecrire un nombre dans un seul octet ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecrire un nombre dans un seul octet ?

n°995288
Froozen
Posté le 27-02-2005 à 23:09:25  profilanswer
 

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
mood
Publicité
Posté le 27-02-2005 à 23:09:25  profilanswer
 

n°995290
Pillow
'cos the trees won't talk
Posté le 27-02-2005 à 23:09:46  profilanswer
 

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
n°995302
Froozen
Posté le 27-02-2005 à 23:12:34  profilanswer
 

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);

n°995305
Froozen
Posté le 27-02-2005 à 23:12:59  profilanswer
 

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
n°995306
KangOl
Profil : pointeur
Posté le 27-02-2005 à 23:13:12  profilanswer
 

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


---------------
Nos estans firs di nosse pitite patreye...
n°995307
WhatDe
Posté le 27-02-2005 à 23:13:41  profilanswer
 

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]
n°995310
KangOl
Profil : pointeur
Posté le 27-02-2005 à 23:14:37  profilanswer
 

taz va faire une attaque :D


---------------
Nos estans firs di nosse pitite patreye...
n°995315
chrisbk
-
Posté le 27-02-2005 à 23:15:32  profilanswer
 

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

n°995333
Froozen
Posté le 27-02-2005 à 23:24:12  profilanswer
 

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...

n°995339
chrisbk
-
Posté le 27-02-2005 à 23:27:10  profilanswer
 

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

mood
Publicité
Posté le 27-02-2005 à 23:27:10  profilanswer
 

n°995341
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-02-2005 à 23:28:36  profilanswer
 

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/
n°995346
Froozen
Posté le 27-02-2005 à 23:32:13  profilanswer
 

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...

n°995347
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-02-2005 à 23:32:17  profilanswer
 

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/
n°995350
Froozen
Posté le 27-02-2005 à 23:33:20  profilanswer
 

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:

n°995351
chrisbk
-
Posté le 27-02-2005 à 23:33:23  profilanswer
 

Froozen a écrit :

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


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

n°995354
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-02-2005 à 23:34:27  profilanswer
 

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/
n°995357
Froozen
Posté le 27-02-2005 à 23:36:13  profilanswer
 

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.

n°995358
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-02-2005 à 23:36:32  profilanswer
 

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/
n°995359
chrisbk
-
Posté le 27-02-2005 à 23:37:21  profilanswer
 

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


 

n°995361
Froozen
Posté le 27-02-2005 à 23:40:24  profilanswer
 

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 ?

n°995363
++fab
victime du syndrome IH
Posté le 27-02-2005 à 23:40:30  profilanswer
 

docteur es segfault a parlé :D

n°995368
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-02-2005 à 23:46:23  profilanswer
 

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/
n°995421
Sve@r
Posté le 28-02-2005 à 07:51:27  profilanswer
 

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.
n°995428
chrisbk
-
Posté le 28-02-2005 à 08:57:06  profilanswer
 

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])
 

n°995429
chrisbk
-
Posté le 28-02-2005 à 08:57:48  profilanswer
 

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

n°995451
Taz
bisounours-codeur
Posté le 28-02-2005 à 09:28:36  profilanswer
 

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

n°995454
Sve@r
Posté le 28-02-2005 à 09:33:07  profilanswer
 

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" )

n°995476
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2005 à 10:06:25  profilanswer
 

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/
n°995485
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2005 à 10:16:57  profilanswer
 

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/
n°995489
chrisbk
-
Posté le 28-02-2005 à 10:20:40  profilanswer
 

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

n°995494
Froozen
Posté le 28-02-2005 à 10:24:09  profilanswer
 

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:  

n°995495
chrisbk
-
Posté le 28-02-2005 à 10:25:01  profilanswer
 

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

n°995498
Froozen
Posté le 28-02-2005 à 10:28:05  profilanswer
 

Sinon merci pour vos nombreuses réponses :jap:

n°995499
Froozen
Posté le 28-02-2005 à 10:28:33  profilanswer
 

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.

n°995656
Sve@r
Posté le 28-02-2005 à 13:00:32  profilanswer
 

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.
n°995658
++fab
victime du syndrome IH
Posté le 28-02-2005 à 13:03:13  profilanswer
 

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
n°995867
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2005 à 15:13:06  profilanswer
 

++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/
n°996856
++fab
victime du syndrome IH
Posté le 01-03-2005 à 10:15:26  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Ecrire un nombre dans un seul octet ?

 

Sujets relatifs
Limitation du nombre d'argumentsDéterminer le nombre de nouveaux fichiers
Génération d'un nombre aléatoire entre 0 et 2^31-1 sous Visual C++ 6.0Saisir un seul caractere
Connaître le nombre de champ envoyé par un formulaire[usb linux ISO] 1 grande image : plusieurs urb's ou un seul grand ?
[PHP]Calculer le nombre de samedi se trouvant entre 2 datesEcrire un conteneur STL dans une mémoire partagée
[C#] Ouvrir un fichier texte et écrire dedans avec "WriteLine()"un nombre de 1024 bits fait combien de chiffres ?
Plus de sujets relatifs à : Ecrire un nombre dans un seul octet ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR