Probleme de mapping memoire[résolu]

Probleme de mapping memoire[résolu] - C - Programmation

Marsh Posté le 06-07-2005 à 10:11:27    

bonjour,
 
voici mon probleme :
 
j'ai une structure :  

Code :
  1. typedef struct {
  2.   unsigned int  var1;
  3.   unsigned char var2;
  4.   unsigned char var3;
  5. }struc_mod_part;


 
et un tableau :

Code :
  1. unsigned char tab[sizeof(struc_mod_part)];


 
j'aimerai recopier les donnée de l'un dans l'autre, c'est à dire si struc_mod_part.var2 = 6 alors tab[2]==6
 
il y a t'il un moyen simple ??


Message édité par deff le 06-07-2005 à 15:56:26
Reply

Marsh Posté le 06-07-2005 à 10:11:27   

Reply

Marsh Posté le 06-07-2005 à 10:21:33    

deff a écrit :

et un tableau :

Code :
  1. unsigned char tab[sizeof(struc_mod_part)];




 
Euh, tu es sûr de ton coup, là ?  :heink:  
 
Parce que sizeof retourne le nombre de bytes occupés par ta structure, tu es certain que c'est ce que tu veux comme nombre de valeur dans ton tableau ?

Reply

Marsh Posté le 06-07-2005 à 10:36:23    

ben je pense  :pt1cable:  
je veux que mon tableau ai la meme taille que ma structure.
 
c pas bon ????

Reply

Marsh Posté le 06-07-2005 à 10:40:01    

deff a écrit :

ben je pense  :pt1cable:  
je veux que mon tableau ai la meme taille que ma structure.
 
c pas bon ????


 
Par "la même taille", tu entends quoi au juste ?
Il faut bien voir que ce que tu es en train de faire, c'est de définir un tableau de bytes non signés dont le nombre d'éléments est égal au nombre de bytes qu'occupe ta structure en mémoire.
Y a moyen de faire quelque chose, mais ça dépend de ce que tu cherches à faire, et il y a peut-être moyen de faire plus simple.
 
 
Tu veux faire quoi exactement ?
 
 
EDIT : 4 x "faire" en deux phrases, vive mon vocabulaire varié  [:jar jar]


Message édité par Elmoricq le 06-07-2005 à 10:49:04
Reply

Marsh Posté le 06-07-2005 à 10:43:23    

tu peux peut etre essayer de faire qqch avec ca:
 

Code :
  1. memcpy((char*)tab, (char*)&struc_mod_part, sizeof(struc_mod_part);


 
ca copie les données apres faut voir dans quel ordre elles sont placées (ca dépend peut etre du compilo) mais y a des chances que ce soit sous la forme:
 

Code :
  1. unsigned int var1 = *((unsigned int*)tab);


unsigned char var2 = tab[4];
unsigned char var3 = tab[5];

Code :
  1. unsigned char var2 = tab[sizeof(unsigned int)];
  2. unsigned char var3 = tab[sizeof(unsigned int) + 1];


 
ou alors
 

Code :
  1. unsigned char var3 = tab[0];
  2. unsigned char var2 = tab[1];
  3. unsigned int var1 = *((unsigned int*)(tab + 2));


 

Citation :

si struc_mod_part.var2 = 6 alors tab[2]==6


 
(mais bon ca te donnera pas var1 <-> tab[1], var2 <-> tab[2], etc)


Message édité par chicotruss le 06-07-2005 à 10:51:59
Reply

Marsh Posté le 06-07-2005 à 10:47:25    

chicotruss a écrit :

Code :
  1. unsigned int var1 = *((unsigned int*)tab);
  2. unsigned char var2 = tab[4];
  3. unsigned char var3 = tab[5];




 
 
Et si c'est compilé sur une plateforme 64 bits ? Ou 16 bits ?  :o  
 
En plus je voudrais savoir ce qu'il veut faire exactement, car je ne vois pour l'instant pas l'intérêt de la chose.

Reply

Marsh Posté le 06-07-2005 à 10:58:05    

je veux simplement recopier les données qui sont dans une structure et les mettre dans un tableau de byte.
 
apres le but final, c'est une autre histoire....

Reply

Marsh Posté le 06-07-2005 à 11:10:11    

deff a écrit :

je veux simplement recopier les données qui sont dans une structure et les mettre dans un tableau de byte.


memcpy()


---------------
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 06-07-2005 à 15:08:29    

non ça n'a pas l'air de bien marcher avec memcpy.
 
j'ai fait cette essai :

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(int argc, char *argv[])
  4. {
  5.  
  6. typedef struct
  7.   unsigned int  var1;
  8.   unsigned char var2;
  9.   unsigned char var3; 
  10. }struc_mod_part;
  11. unsigned char tab[10]={1,1,1,1,1,1,1,1,1,1};
  12. struc_mod_part mp;
  13. mp.var1=0x1122;
  14. mp.var2=0x33;
  15. mp.var3=0x44;
  16. memcpy((unsigned char*)tab, (unsigned char*)&mp, sizeof(struc_mod_part));
  17. printf("%x %x %x %x %x %x %x %x %x %x\n",tab[0],tab[1],tab[2],tab[3],tab[4],tab[5],tab[6],tab[7],tab[8],tab[9]);
  18.    return 0;
  19. }


 
ça me retourne : 22 11 0 0 33 44 4 8 1 1
 
au lieu de : 22 11 33 44 1 1 1 1 1 1
 
 
??????

Reply

Marsh Posté le 06-07-2005 à 15:15:55    

Normal : unsigned int sur ta plateforme = 4 bytes, donc peu importe comment tu l'initialises, ça occupera 4 bytes, donc 4 cases de ton tableau.

Reply

Marsh Posté le 06-07-2005 à 15:15:55   

Reply

Marsh Posté le 06-07-2005 à 15:25:30    

deff a écrit :

non ça n'a pas l'air de bien marcher avec memcpy.
 

Code :
  1. typedef struct
  2.   unsigned int  var1;
  3.   unsigned char var2;
  4.   unsigned char var3; 
  5. }struc_mod_part;




Dans une structure, il peut y avoir des bytes de padding... Il est temps d'ouvrir ton livre de C...
 
Mapper une structure sur un tableau de char produit un résultat qui dépend de l'implémentation. C'est pas portable.


Message édité par Emmanuel Delahaye le 06-07-2005 à 15:26:05

---------------
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 06-07-2005 à 15:56:07    

ok ça marche maintenant !
j'ai changé les int en short et c'est ok.
 
merci pour tout.

Reply

Sujets relatifs:

Leave a Replay

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