1

Est il possible d'obliger l'ordre d'une structure ie sans que le compilo reordonne la structure...
Je cherche une sollution compatible VC++ et gcctongue merci

2

Essaye de tout packer peut etre. Moue bof quand meme.
Tu as quoi dans ta structure, et pourquoi est-elle reordonnee ?
Essaye de mettre les types a alignement les plus forts en premiers, puis apres les plus gros, et ensuite les plus faibles.
Genre:
double > char * > long > int > short > char
Un tableau d'elements ne change pas sa place

3

Je suis peut etre hors-sujet mais regarde ce que tu pourrais avec avec le mot cle "volatile"

Il me semble qu'il permet de faire en sorte que le compilno ne change rien pour des raisons d'optimisations afin de pouvoir permettre aux dev de bidouiller.
Vini, vidi, vici !

4

Oui, tu es hors sujet.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

Folays :
Je suis peut etre hors-sujet mais regarde ce que tu pourrais avec avec le mot cle "volatile"

Il me semble qu'il permet de faire en sorte que le compilno ne change rien pour des raisons d'optimisations afin de pouvoir permettre aux dev de bidouiller.

Volatile indique au compilateur que le contenu de la variable spécifiée peut changer sans égard au flux normal d'exécution, je ne pense pas que ça change quoi que ce soit au sujet de l'allignement malheureusement.

6

en fait le format de structure n'est pas forcement defini par mon programme, exemple header des fichiers md2, par consequent, je susi obligé de passer par des ruses, et c'est chian:'

7

J'ai une autre question du meme genre:
/* vecteur */
typedef float vec3_t[3];
et j'ai une classe CVector dont les seules donnees sont 3 floats x,y,z.
normalement je peux faire au lieu de:
typedef struct
{
float scale[3];
float translate[3];
char name[16];
triangleVertex_t vertices[1];
} frame_t;
ca:
typedef struct
{
CVector scale;
...
} frame_t;
non?

8

./1> Euh il ne me semble pas que le compilateur ait le droit de réordonner les données dans les structures, donc t'as pas à t'inquiéter pour ça normalement.
./7> Si tu fais ça, pour que ça puisse marcher sans avoir à modifier tout le reste du code, CVector doit implémenter l'opérateur []

Euh sinon remarque un peu hors sujet : je suis ptet un peu à l'ouest, mais on dirait que ton truc décrit une transformation. Si c'est le cas (sinon oublie la question), pourquoi tu n'utilises pas une matrice de transformation ?

9

Si Si le compilo a droit d'ordonner les données d'une structure, sauf la premiere qui doit rester premiere (les files de msg sont basées la dessus). D'ailleur je prog sous XCode avec gcc et mes potes sous VC++ et ca ordonne pas de la meme maniere... :/
Heu en fait CVector sera utiliser pour afficher une map en 3D ainsi que des models md2. Je me soucis pas trop de l'optimisation (je perde surment en vitesse en utilisant les classes pour ca..) mais de la lisibilité du code (c'est pour mon ecole), et je prefere voir V3=2*V1+... que 3 lignes sur x, y, z.
Il y a des pragma pour dire de ne pas ordonner sous VC++, mais bon biensure c'est pas portable..

10

JackosKing
: Si Si le compilo a droit d'ordonner les données d'une structure

Euh, non. En C, les membres (hors bitfield) de la structure doivent avoir des adresses qui augmentent dans l'ordre où ils sont déclarés. Autrement dit, il peut y avoir du padding, mais pas de réordonnancement.
Idem en C++ pour les membres (hors static) qui appartiennent au même groupe d'accès. Par contre différents groupes d'accès peuvent être réordonnés.
So much code to write, so little time.

11

Heu en fait CVector sera utiliser pour afficher une map en 3D ainsi que des models md2.
J'ai gagné cheeky
Je me soucis pas trop de l'optimisation (je perde surment en vitesse en utilisant les classes pour ca..)
si tes classes sont propres, elles seront tout aussi rapides que le même code en C (en tous cas au moins pour une classe simple comme celle-ci).
mais de la lisibilité du code (c'est pour mon ecole), et je prefere voir V3=2*V1+... que 3 lignes sur x, y, z.
Oué, d'où l'intéret d'implémenter les 3 opérateurs que je t'ai dit :
Si V3 = 2*V1 est autorisé, ne pas autoriser
V3 = V1*2
ou
V3 *= 2
C'est contre-intuitif au possible, vaut mieux le faire, ce sera plus propre, et tout aussi lisible.

12


Euh, non. En C, les membres (hors bitfield) de la structure doivent avoir des adresses qui augmentent dans l'ordre où ils sont déclarés. Autrement dit, il peut y avoir du padding, mais pas de réordonnancement.

Et ca peut tout faire planter. Tu peux forcer le padding avec GCC a certaines valeurs.

13

nitro
: Idem en C++ pour les membres (hors static) qui appartiennent au même groupe d'accès. Par contre différents groupes d'accès peuvent être réordonnés.
C'est quoi un groupe d'accès ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

14

Les groupes séparés par public, private, protected.
So much code to write, so little time.

15

Grr et voilà j'ai un probleme de pading sous gcc...
mon code marche nikel sous VC++ (pour lire un md2, donc structure obligée).
et sous gcc... c la merde.

comment y remedier?

16

Bon j'ai calculer le padding sous VC++ et GCC: et les 2 sont egaux a zeros!!!! (normal vu la structure...)

typedef struct
{
    int Ident;          // Identifiant : "IDP2"
    int Version;        // version du format : 8

    int SkinWidth;      // Largeur texture
    int SkinHeight;     // Hauteur texture

    int FrameSize;      // Taille d'une frame en octets

    int NbrSkin;		// Nombre de skins
    int NbrVertex;		// Nombre de vertexes par frame
    int Nbrst;			// Nombre de coordonnées de texture
    int NbrTriangle;    // Nombre de triangles
    int NbrGLCmd;		// Nombre de commandes opengl
    int NbrFrame;		// Nombre de frames

    int OffSkin;		// Offset données skins
    int Offst;			// Offset données coordonnées de texture
    int OffTriangle;    // Offset données triangles
    int OffFrame;		// Offset données frames
    int OffGLCmd;		// Offset données commandes OpenGL
    int OffEnd;			// Offset fin de fichier
}SMd2Header;


	fstream File;

	File.open(_pMd2FileName, ios::in | ios::binary);
	if (File.fail())
	{
		cout<<"Md2 File: Can't open "<<_pMd2FileName<<endl;
		return false;
	}

	File.read((char *)&Md2Header, sizeof(SMd2Header) );
	if( (Md2Header.Version != MD2_VERSION) || Md2Header.Ident != MD2_IDENT )
	{
		cout<<"Md2 Format: "<<_pMd2FileName<<" Bad version.PADDING("<<sizeof(SMd2Header)-17*sizeof(int)<<")"<<endl;
		return false;
	}

Alors ca marche sous XP VC++ x86 32bits et pas sous ibook...
Une explication?

17

header MD2: little endian
x86: little endian
powerpc: big endian
So much code to write, so little time.

18

Erf je voulais pas croire a ca ...
Donc aucune chance de faire un code symple compatible sad

19

Bah si, il suffit de convertir toute la structure de little endian vers big endian quand le host est big endian, et tout le reste du code est identique.
So much code to write, so little time.

20

Mouai ok, je devrais pas sous ibook...

Je regrette de plus en plus mon achat GRR

21

Nan le problème c'est pas le matériel, c'est ton programme. C'est à ton programme de faire la conversion. Ne déplace pas les responsabilités wink

22

Je vais pas perdre du temps a faire une telle conversion pour mon projet (sachant qu'il faut que je le fasse pour les perso (vertex etc...) pour les maps ...) alors qu'il est destiné aux x86 sous linux...

23

JackosKing
: Mouai ok, je devrais pas sous ibook...

Bah si, vu que le processeur est big endian, comme tout plein d'autres d'ailleurs.
L'ordre standard des transferts réseau est big endian également.
So much code to write, so little time.

24

Le temps que tu as poste a guele sur le topic est egal au temps necessaire pour faire la conversion BigEndian -> LittleEndian.

25

Si ct si court ce serai deja fait.