| moumout511 | Le programme ci-dessous permet de tester le problème de l’endian et de l’hypothétique problème d’incompatibilité de fonctions du C incorporés dans un projet  C++ :
 
 | Code : 
 #include "stdafx.h"#include <cstdio>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define ByteSwap5(x) ByteSwap((unsigned char *) &x,sizeof(x))void ByteSwap(unsigned char * b, int n){   register int i = 0;   register int j = n-1;   while (i<j)   {      swap(b[i], b[j]);      i++, j--;   }}int main(int argc, char* argv[]){	FILE *fp;	fp = fopen("C:\\Documents and Settings\\Ludo\\Bureau\\ezdata\\sample\\sample1.ezd","rb" );	if (!fp)	{  printf("Probleme d'ouverture de fichier\n" );	}	else	{  char Name1[100];  time_t Time1;  float StepX1, StepY1, XStart1;  long Number1;  fread(Name1,     sizeof(char),   100, fp);  fread(&Time1,    sizeof(time_t), 1, fp);  fread(&StepX1,   sizeof(float),  1, fp);  fread(&StepY1,   sizeof(float),  1, fp);  fread(&XStart1,  sizeof(float),  1, fp);  fread(&Number1,  sizeof(long),   1, fp);  fclose(fp);  cout<<"Test avec fread:"<<endl;  cout<<"Name="<<Name1<<endl;  cout<<"Time="<<Time1<<endl;  cout<<"StepX="<<StepX1<<endl;  cout<<"StepY="<<StepY1<<endl;  cout<<"XStart="<<XStart1<<endl;  cout<<"Number="<<Number1<<endl;	}	ifstream f("C:\\Documents and Settings\\Ludo\\Bureau\\ezdata\\sample\\sample1.ezd",ios::in|ios::binary);	if(!f.is_open())cout<<"Impossible d'ouvrir le fichier en lecture !"<<endl;	else	{  char Name2[100];  time_t Time2;  float StepX2, StepY2, XStart2;  long Number2;  for(size_t i=0;i<100;i++){f.read((char *)&Name2[i],sizeof(char));}  f.read((char *)&Time2,sizeof(time_t));  f.read((char *)&StepX2,sizeof(float));  f.read((char *)&StepY2,sizeof(float));  f.read((char *)&XStart2,sizeof(float));  f.read((char *)&Number2,sizeof(long));  f.close();  cout<<"Test avec ifstream::read:"<<endl;  cout<<"Name="<<Name2<<endl;  cout<<"Time="<<Time2<<endl;  cout<<"StepX="<<StepX2<<endl;  cout<<"StepY="<<StepY2<<endl;  cout<<"XStart="<<XStart2<<endl;  cout<<"Number="<<Number2<<endl;  ByteSwap5(Time2);  ByteSwap5(StepX2);  ByteSwap5(StepY2);  ByteSwap5(XStart2);  ByteSwap5(Number2);  cout<<"Swap:"<<endl;  cout<<"Time="<<Time2<<endl;  cout<<"StepX="<<StepX2<<endl;  cout<<"StepY="<<StepY2<<endl;  cout<<"XStart="<<XStart2<<endl;  cout<<"Number="<<Number2<<endl;	} 	return 0;}
 | 
 
 Résultats:
 
 Test avec fread:
 Name=__ezGet.net dataFormat 5__This is the <u>native data</u> for ezDatar.
 <font size='+4'>Now</font>, yo╠╠╠╠╠╠╠╠`↔1►╠╠╠╠üÏ■9¿ ↕
 Time=8319591545089237109
 StepX=8.67581e+020
 StepY=4.51558e+027
 XStart=0.0140029
 Number=540959279
 Test avec ifstream::read:
 Name=__ezGet.net dataFormat 5__This is the <u>native data</u> for ezDatar.
 <font size='+4'>Now</font>, yo╠╠╠╠╠╠╠╠PrQ►♦
 Time=8319591545089237109
 StepX=8.67581e+020
 StepY=4.51558e+027
 XStart=0.0140029
 Number=540959279
 Swap:
 Time=8439854971802908019
 StepX=4.72933e+022
 StepY=0.237707
 XStart=2.92643e+029
 Number=794967584
 Appuyez sur une touche pour continuer...
 
 Ce test montre que pour les fonctions du C et les méthodes du C++ renvoient les mêmes valeurs, sauf pour la chaîne de caractères (???). Le swap des bits ne change rien, les valeurs sont toujours aussi catastrophiques...
   |