probleme de structure

probleme de structure - C - Programmation

Marsh Posté le 23-08-2007 à 11:09:55    

bonjour tout le monde, j'ai un petit soucis avec une structure.
Voici ma strucutre :

Code :
  1. struct CacheInfo //type 7
  2. {
  3. byte SocketDesignation;
  4. word Configuration;
  5. word MaxSize;
  6. word InstalledSize;
  7. word SupportedSRAM;
  8. word CurrentSRAM;
  9. byte Speed;
  10. byte ErrorCorrection;
  11. byte SystemeCacheType;
  12. byte Associativity;
  13. string *chaine;
  14. };
 

avec

Code :
  1. typedef char byte;
  2. typedef short word;
  3. typedef long dword;
  4. typedef long long qword;
 

et lors de l'utilisation de la strucuture

Code :
  1. int CacheLevel;
  2. remplistruct(&cache, header,mem);
  3.   cache.chaine=chaine(mem);
  4.   CacheLevel=(cache.Configuration&0x3)+1;
  5.   cout<<"cache L"<<CacheLevel<<endl;


le cout me sort une valeur qui ne me convient pas.

 


J'ai du coup essayé autre chose :

Code :
  1. struct CacheInfo //type 7
  2. {
  3. char test[15];
  4. }


Code :
  1. int CacheLevel;
  2. remplistruct(&cache, header,mem);
  3.   cache.chaine=chaine(mem);
  4.   CacheLevel=(cache.test[1]&0x3)+1;
  5.   cout<<"cache L"<<CacheLevel<<endl;
 

et la le resultat est ce qu'il faut !

 

Est ce que vous voyez ou je me suis planté car je prefere largement utiliser la 1ere  structure (le 2nd cas n'est qu'une illustration j'utiliserai pas de structure pour faire ca en temps normal)

 

OS linux Debian
Compilo gcc  4.1.3 20070629 (prerelease) (Debian 4.1.2-13)

Message cité 1 fois
Message édité par carot0 le 23-08-2007 à 11:17:01

---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 23-08-2007 à 11:09:55   

Reply

Marsh Posté le 23-08-2007 à 12:01:04    

carot0 a écrit :

Code :
  1. int CacheLevel;
  2.   cout<<"cache L"<<CacheLevel<<endl;




Pas du C. Le forum C++, c'est à coté.
 


---------------
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 23-08-2007 à 12:05:11    

Emmanuel Delahaye a écrit :


Pas du C. Le forum C++, c'est à coté.
 


le probleme n'est pas dans l'affichage mais dans la strucutre (qui est bien codé en C) on a qu'a dire que c'est un printf ca ne change rien au probleme!
 
Je me demande aussi si mon probleme n'est pas lié a un alignement mémoire...


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 23-08-2007 à 12:25:07    

rien compris, ni rien lu, juste que pour struct avec un aussi joli de nom que  CacheInfo, tu ferais bien de la tasser un peu en ordonnant les membres par taille décroissante.

Reply

Marsh Posté le 23-08-2007 à 12:33:45    

Taz a écrit :

rien compris, ni rien lu, juste que pour struct avec un aussi joli de nom que  CacheInfo, tu ferais bien de la tasser un peu en ordonnant les membres par taille décroissante.


je l'aurai fait si c'etait possible mais cette structure est codé selon des données qui sont déja ordonné dans cet ordre (donc si je change l'ordre des champs ca deviendra incohérent)

 

quelqu'un sais comment désactiver l'alignement mémoire des strucutre avec gcc ?

 

edit : il te plait pas le nom de ma structure ?

Message cité 1 fois
Message édité par carot0 le 23-08-2007 à 12:34:27

---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 23-08-2007 à 12:42:30    

carot0 a écrit :

je l'aurai fait si c'etait possible mais cette structure est codé selon des données qui sont déja ordonné dans cet ordre


Faute de conception (code non portable). Il faut utiliser un tableau de unsigned char et manipuler les octets à la main. On écrit les 2 fonction de conversion de/vers des structures internes et ça marche.

 

Message cité 1 fois
Message édité par Emmanuel Delahaye le 23-08-2007 à 12:43:17

---------------
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 23-08-2007 à 12:45:02    

__attribute__

Reply

Marsh Posté le 23-08-2007 à 12:47:17    

Emmanuel Delahaye a écrit :


Faute de conception (code non portable). Il faut utiliser un tableau de unsigned char et manipuler les octets à la main. On écrit les 2 fonction de conversion de/vers des structures internes et ça marche.
 


ouais... ce qui y a c'est que des structure comme elles j'en est une 15aines donc la j'ai de quoi me prendre la tête pour longtemps ...
 
pour le __attribute__ je sais pas ce que c'est, je vais donc voir ca sur google.


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 23-08-2007 à 13:46:16    

Taz a écrit :

__attribute__


thx ca a marché !!  
avec un __attribute__ ((packed))


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 23-08-2007 à 14:15:22    

carot0 a écrit :


thx ca a marché !!  
avec un __attribute__ ((packed))


Jusqu'au jour où tu passes de x86 à PowerPC...
 


---------------
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 23-08-2007 à 14:15:22   

Reply

Marsh Posté le 23-08-2007 à 14:23:35    

ou juste en 64bits

Reply

Marsh Posté le 23-08-2007 à 14:51:37    

Taz a écrit :

ou juste en 64bits


comment faire pour que ca marche en 64bit aussi ? ( mon programme n'est prévue que pour PC )


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 23-08-2007 à 15:06:42    

Emmanuel a deja donne la reponse.   Il faut manipuler les octets un a un.

Reply

Marsh Posté le 23-08-2007 à 15:08:28    

Un Programmeur a écrit :

Emmanuel a deja donne la reponse.   Il faut manipuler les octets un a un.


ha .... ca va être trop la misere alors ... thx
 
edit : en fait je comprends  pourquoi le "__attribute__ ((packed));" marcherai pas sur les autre archi ?
sachant que je fournirai pas le binaire mais le code sources + un make ou le binaire pour des archi bien spécifique.


Message édité par carot0 le 23-08-2007 à 15:48:27

---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Sujets relatifs:

Leave a Replay

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