IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème de portabilité du programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut Problème de portabilité du programme
    Bonjour à tous,

    J'ai écrit un programme pour comparer deux fichiers binaires encodé en byte, double ou float.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int comparerFichiersBinairesType(char * nomf1, char * nomf2, int nbOctet, float seuil);
    int comparerFichiersBinairesTypeByte(char * nomf1, char * nomf2);
    int comparerFichiersBinairesTypeDouble(char * nomf1, char * nomf2, float seuil);
    int comparerFichiersBinairesTypeFloat(char * nomf1, char * nomf2, float seuil);
     
    int main (int argc, char * argv[]){
    	printf("%s %s %s %s\n",argv[1], argv[2],argv[3], argv[4]); 
    	comparerFichiersBinairesType(argv[1], argv[2], atoi(argv[3]), atof(argv[4]));	
    	return 0;
    }
     
    int comparerFichiersBinairesType(char * nomf1, char * nomf2, int nbOctet, float seuil){
    	if (nbOctet == 1)
    		comparerFichiersBinairesTypeByte(nomf1, nomf2); 
    	else if (nbOctet == 4)
    		comparerFichiersBinairesTypeFloat(nomf1, nomf2, seuil);
    	else
    		comparerFichiersBinairesTypeDouble(nomf1, nomf2, seuil);
    	return 0;
    }
     
    int comparerFichiersBinairesTypeByte(char * nomf1, char * nomf2){
    	FILE *fic1;
    	FILE *fic2;
    	int n1, n2, n3;
     
    	fic1 = fopen(nomf1,"rb");
    	fic2 = fopen(nomf2,"rb");
    	if( fic1 == NULL || fic2 == NULL )
    		return 0;
     
    	while( fread(&n1, 1, 1,fic1)) {
    		fread(&n2, 1, 1,fic2);
    		if (n1 != n2) {
    			// Fonction gererErreur
    			printf("%s (valeur: %d) et %s (valeur: %d)\n", nomf1, n1, nomf2, n2);
    			//system("! sh TnrMge.sh $ERR_FICHIERBINDIFF && exit $ERR_FICHIERBINDIFF");
    		} 
    	}	
    	fclose(fic1);
    	fclose(fic2);
    	return 0;
    }
     
    int comparerFichiersBinairesTypeDouble(char * nomf1, char * nomf2, float seuil){
    	FILE *fic1;
    	FILE *fic2;
    	double n1, n2;
    	float ecartInf = 1.0 - seuil, ecartSup = 1.0 + seuil;
     
    	fic1 = fopen(nomf1,"rb");
    	fic2 = fopen(nomf2,"rb");
    	if( fic1 == NULL || fic2 == NULL )
    		return 0;
     
    	while( fread(&n1, sizeof(double), 1,fic1)) {
    		fread(&n2, sizeof(double), 1,fic2);
    		if (n1 != n2) {
    			if ((n2 < n1*ecartInf) || (n2 > n1*ecartSup)){ 
    				// Fonction gererErreur
    				printf("%s (valeur: %lf) et %s (valeur: %lf)\n", nomf1, n1, nomf2, n2);
    				//system("! sh TnrMge.sh $ERR_FICHIERBINDIFF && exit $ERR_FICHIERBINDIFF");
    			}
    		}
    	}	
    	fclose(fic1);
    	fclose(fic2);
    	return 0;
    }
     
    int comparerFichiersBinairesTypeFloat(char * nomf1, char * nomf2, float seuil){
    	FILE *fic1;
    	FILE *fic2;
    	float n1, n2;
    	float ecartInf = 1.0 - seuil, ecartSup = 1.0 + seuil;
     
    	fic1 = fopen(nomf1,"rb");
    	fic2 = fopen(nomf2,"rb");
    	if( fic1 == NULL || fic2 == NULL )
    		return 0;
     
    	while( fread(&n1, sizeof(float), 1,fic1)) {
    		fread(&n2, sizeof(float), 1,fic2);
    		if (n1 != n2) {
    			if ((n2 < n1*ecartInf) || (n2 > n1*ecartSup)){ 
    				// Fonction gererErreur
    				printf("%s (valeur: %f) et %s (valeur: %f)\n", nomf1, n1, nomf2, n2);
    				//system("! sh TnrMge.sh $ERR_FICHIERBINDIFF && exit $ERR_FICHIERBINDIFF");
    			}
    		}
    	}	
    	fclose(fic1);
    	fclose(fic2);
    	return 0;
    }
    Sur ma machine, ce code fonctionne correctement (Mandriva est l'OS). Cependant, sur un autre poste ayant une autre version de Mandriva, il ne fonctionne pas.
    Pourriez vous m'aidez? J'aimerais comprendre où est le problème et le résoudre.
    Merci par avance

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par cayou Voir le message
    Sur ma machine, ce code fonctionne correctement (Mandriva est l'OS). Cependant, sur un autre poste ayant une autre version de Mandriva, il ne fonctionne pas.
    Pourriez vous m'aidez? J'aimerais comprendre où est le problème et le résoudre.
    Merci par avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:10: warning: unused parameter 'argc'
    main.c: In function `comparerFichiersBinairesTypeByte':
    main.c:29: warning: unused variable `n3'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 2 warnings
    Il est suspect que argv soit utilisé et pas argc. Ca veut dire que tu ne vérifies pas le nombre de paramètres avant de les utiliser...

    n3 n'est pas utilisé. C'est normal ?

    Il faudrait donner un lien vers les fichiers binaires concernés. Ils ont été créés comment ?
    (je n'ai pas de fichiers et ça crash sévèrement... aucun contrôle de paramètres, ni d'ouverture de fichiers...)

    Au fait, c'est quoi le problème ("ça marche pas", c'est pas très précis...).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut
    J'ai effectivement oublié de préciser que sur la version qui "fonctionne" j'ai été obligé de laisser la déclaration de n3.
    n3 était à la base un compteur d'erreur, que j'ai voulu supprimer. Sa suppression entrainait un mauvais comportement de mon programme, je l'ai donc laissé. Pour ce qui est de argc, je ne le vérifie pas car ce programme c est en fait appelé par un programme sh sui lui envoie le bon nombre d'arguments et des arguments valides.
    Je vais quand meme ajouté la verif au cas ou.
    Les fichiers binaires ont été créés avec ilwis.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut
    J'ai ajouté le test sur argc et j'ai supprimé n3
    Ca change rien.
    Ma version A fonctionne toujours: c'est à dire que je teste sur deux fichiers binaire en byte et qu'il y a pas d'erreur identiques
    et ma version B fonctionne pas: c'est à dire qu'elle n'arrive pas à lire les octets correctement et qu'elle me trouve des différences à chaque octet.

    remarque: pour n3, sur ma version A c'est le même problème. Si j'enlève la déclaration de n3 ça marche plus.

    C'est pas un problème d'allocation de mémoire?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut
    Il doit forcement y avoir une raison à ces problemes inattendus.
    J'ai essayé de réécrire plusieurs fois le meme programme.
    - En commencant par la fonction ComparerFichiersBinairesTypeByte et quand j'ai modifié mon main pour intégrer les autres fonctions j'ai eu le meme probleme: mes fichiers etaient devenus différents pour lui!!!
    - En laissant l'ossature de mon programme et en intégrant mon code progressivement. Quand j'ai inséré le while meme problème: les fichiers binaires étaient considérés comme différent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    ima10.gr# ima102.gr# 1 1.001
    ima10.gr# (valeur: 73) et ima102.gr# (valeur: -1078939575)
    ima10.gr# (valeur: 76) et ima102.gr# (valeur: -1078939572)
    ima10.gr# (valeur: 87) et ima102.gr# (valeur: -1078939561)
    ima10.gr# (valeur: 73) et ima102.gr# (valeur: -1078939575)
    ima10.gr# (valeur: 83) et ima102.gr# (valeur: -1078939565)
    ima10.gr# (valeur: 32) et ima102.gr# (valeur: -1078939616)
    ima10.gr# (valeur: 50) et ima102.gr# (valeur: -1078939598)
    ima10.gr# (valeur: 46) et ima102.gr# (valeur: -1078939602)
    ima10.gr# (valeur: 48) et ima102.gr# (valeur: -1078939600)
    ima10.gr# (valeur: 48) et ima102.gr# (valeur: -1078939600)
    ima10.gr# (valeur: 32) et ima102.gr# (valeur: -1078939616)
    ima10.gr# (valeur: 84) et ima102.gr# (valeur: -1078939564)
    ima10.gr# (valeur: 97) et ima102.gr# (valeur: -1078939551)
    ima10.gr# (valeur: 98) et ima102.gr# (valeur: -1078939550)
    ima10.gr# (valeur: 108) et ima102.gr# (valeur: -1078939540)
    ima10.gr# (valeur: 101) et ima102.gr# (valeur: -1078939547)
    ima10.gr# (valeur: 13) et ima102.gr# (valeur: -1078939635)
    ima10.gr# (valeur: 10) et ima102.gr# (valeur: -1078939638)
    ima10.gr# (valeur: 26) et ima102.gr# (valeur: -1078939622)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 154) et ima102.gr# (valeur: -1078939494)
    ima10.gr# (valeur: 197) et ima102.gr# (valeur: -1078939451)
    ima10.gr# (valeur: 238) et ima102.gr# (valeur: -1078939410)
    ima10.gr# (valeur: 236) et ima102.gr# (valeur: -1078939412)
    ima10.gr# (valeur: 243) et ima102.gr# (valeur: -1078939405)
    ima10.gr# (valeur: 24) et ima102.gr# (valeur: -1078939624)
    ima10.gr# (valeur: 253) et ima102.gr# (valeur: -1078939395)
    ima10.gr# (valeur: 63) et ima102.gr# (valeur: -1078939585)
    ima10.gr# (valeur: 8) et ima102.gr# (valeur: -1078939640)
    ima10.gr# (valeur: 59) et ima102.gr# (valeur: -1078939589)
    ima10.gr# (valeur: 111) et ima102.gr# (valeur: -1078939537)
    ima10.gr# (valeur: 228) et ima102.gr# (valeur: -1078939420)
    ima10.gr# (valeur: 87) et ima102.gr# (valeur: -1078939561)
    ima10.gr# (valeur: 224) et ima102.gr# (valeur: -1078939424)
    ima10.gr# (valeur: 224) et ima102.gr# (valeur: -1078939424)
    ima10.gr# (valeur: 63) et ima102.gr# (valeur: -1078939585)
    ima10.gr# (valeur: 1) et ima102.gr# (valeur: -1078939647)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 1) et ima102.gr# (valeur: -1078939647)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 2) et ima102.gr# (valeur: -1078939646)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 154) et ima102.gr# (valeur: -1078939494)
    ima10.gr# (valeur: 197) et ima102.gr# (valeur: -1078939451)
    ima10.gr# (valeur: 238) et ima102.gr# (valeur: -1078939410)
    ima10.gr# (valeur: 236) et ima102.gr# (valeur: -1078939412)
    ima10.gr# (valeur: 243) et ima102.gr# (valeur: -1078939405)
    ima10.gr# (valeur: 24) et ima102.gr# (valeur: -1078939624)
    ima10.gr# (valeur: 242) et ima102.gr# (valeur: -1078939406)
    ima10.gr# (valeur: 63) et ima102.gr# (valeur: -1078939585)
    ima10.gr# (valeur: 248) et ima102.gr# (valeur: -1078939400)
    ima10.gr# (valeur: 196) et ima102.gr# (valeur: -1078939452)
    ima10.gr# (valeur: 144) et ima102.gr# (valeur: -1078939504)
    ima10.gr# (valeur: 15) et ima102.gr# (valeur: -1078939633)
    ima10.gr# (valeur: 145) et ima102.gr# (valeur: -1078939503)
    ima10.gr# (valeur: 58) et ima102.gr# (valeur: -1078939590)
    ima10.gr# (valeur: 229) et ima102.gr# (valeur: -1078939419)
    ima10.gr# (valeur: 191) et ima102.gr# (valeur: -1078939457)
    ima10.gr# (valeur: 1) et ima102.gr# (valeur: -1078939647)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 11) et ima102.gr# (valeur: -1078939637)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 2) et ima102.gr# (valeur: -1078939646)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 77) et ima102.gr# (valeur: -1078939571)
    ima10.gr# (valeur: 10) et ima102.gr# (valeur: -1078939638)
    ima10.gr# (valeur: 255) et ima102.gr# (valeur: -1078939393)
    ima10.gr# (valeur: 184) et ima102.gr# (valeur: -1078939464)
    ima10.gr# (valeur: 143) et ima102.gr# (valeur: -1078939505)
    ima10.gr# (valeur: 70) et ima102.gr# (valeur: -1078939578)
    ima10.gr# (valeur: 228) et ima102.gr# (valeur: -1078939420)
    ima10.gr# (valeur: 63) et ima102.gr# (valeur: -1078939585)
    ima10.gr# (valeur: 186) et ima102.gr# (valeur: -1078939462)
    ima10.gr# (valeur: 73) et ima102.gr# (valeur: -1078939575)
    ima10.gr# (valeur: 177) et ima102.gr# (valeur: -1078939471)
    ima10.gr# (valeur: 204) et ima102.gr# (valeur: -1078939444)
    ima10.gr# (valeur: 112) et ima102.gr# (valeur: -1078939536)
    ima10.gr# (valeur: 98) et ima102.gr# (valeur: -1078939550)
    ima10.gr# (valeur: 243) et ima102.gr# (valeur: -1078939405)
    ima10.gr# (valeur: 63) et ima102.gr# (valeur: -1078939585)
    ima10.gr# (valeur: 10) et ima102.gr# (valeur: -1078939638)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 1) et ima102.gr# (valeur: -1078939647)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 2) et ima102.gr# (valeur: -1078939646)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 46) et ima102.gr# (valeur: -1078939602)
    ima10.gr# (valeur: 91) et ima102.gr# (valeur: -1078939557)
    ima10.gr# (valeur: 15) et ima102.gr# (valeur: -1078939633)
    ima10.gr# (valeur: 112) et ima102.gr# (valeur: -1078939536)
    ima10.gr# (valeur: 4) et ima102.gr# (valeur: -1078939644)
    ima10.gr# (valeur: 151) et ima102.gr# (valeur: -1078939497)
    ima10.gr# (valeur: 171) et ima102.gr# (valeur: -1078939477)
    ima10.gr# (valeur: 191) et ima102.gr# (valeur: -1078939457)
    ima10.gr# (valeur: 96) et ima102.gr# (valeur: -1078939552)
    ima10.gr# (valeur: 110) et ima102.gr# (valeur: -1078939538)
    ima10.gr# (valeur: 82) et ima102.gr# (valeur: -1078939566)
    ima10.gr# (valeur: 172) et ima102.gr# (valeur: -1078939476)
    ima10.gr# (valeur: 20) et ima102.gr# (valeur: -1078939628)
    ima10.gr# (valeur: 63) et ima102.gr# (valeur: -1078939585)
    ima10.gr# (valeur: 149) et ima102.gr# (valeur: -1078939499)
    ima10.gr# (valeur: 63) et ima102.gr# (valeur: -1078939585)
    ima10.gr# (valeur: 10) et ima102.gr# (valeur: -1078939638)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 11) et ima102.gr# (valeur: -1078939637)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 2) et ima102.gr# (valeur: -1078939646)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    ima10.gr# (valeur: 0) et ima102.gr# (valeur: -1078939648)
    J'ai pas de ftp pour vous faire passer le binaire mais je vous montre ce qu'affiche mon programme on voit bien que les valeur de n2 sont completement fausses et impossible!!!!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    J'ai réparé la comparaison binaire 'byte' (et réorganisé le codage, il faut apprendre à factoriser...)
    Merci beaucoup pour votre aide. C'est la première fois que j'utilise un forum pour résoudre un problème et j'avoue que c'est super. Ca fait plusieurs jours que je me debats avec mon code et vous m'avez aidé en quelques minutes c'est super. J'ai, par contre toujours pas compris, pourquoi ca se comportait aussi "bizarrement".
    Sinon, le c et moi on est pas amoureux fous alors promis, je vais faire des efforts pour la factorisation (=> Resolution de 2008)
    Merci encore.


    Bonne année à tous

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    cayou
    Il doit forcement y avoir une raison à ces problemes inattendus...
    Pour info, la raison est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	int n1, n2, n3;
    ...
    	while( fread(&n1, 1, 1,fic1)) {
    		fread(&n2, 1, 1,fic2);
    		if (n1 != n2) ....
    Comme tu ne lis qu'un byte, tu ne modifies qu'un byte de n1 et n2. Les autres bytes restent ce qu'ils étaient à savoir... n'importe quoi (dans ton cas, 000000?? et BFB0B0??). Les valeurs dans n1 et n2 sont différentes, elles ont seulement un byte en commun (celui d'adresse &n1 et &n2 qui est dans ton cas le byte de poids faible)!
    Si tu lis 49 (hexa) l'un vaut 00000049 et l'autre BFB0B049

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par cayou Voir le message
    J'ai effectivement oublié de préciser que sur la version qui "fonctionne" j'ai été obligé de laisser la déclaration de n3.
    n3 était à la base un compteur d'erreur, que j'ai voulu supprimer. Sa suppression entrainait un mauvais comportement de mon programme, je l'ai donc laissé. Pour ce qui est de argc, je ne le vérifie pas car ce programme c est en fait appelé par un programme sh sui lui envoie le bon nombre d'arguments et des arguments valides.
    Je vais quand meme ajouté la verif au cas ou.
    Les fichiers binaires ont été créés avec ilwis.
    EDIT : J'ai réparé tout le code (et réorganisé le codage, il faut apprendre à factoriser...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <float.h>
    #include <math.h>
     
    static int comparerFichiersBinairesTypeByte (FILE * fic1, FILE * fic2)
    {
       int err = 0;
       int fin = 0;
     
       while (!err && !fin)
       {
          int n1 = fgetc (fic1);
          fin = n1 == EOF;
          if (!fin)
          {
             int n2 = fgetc (fic2);
             fin = n2 == EOF;
             if (!fin)
             {
                if (n1 != n2)
                {
                   err = 1;
                   printf ("ERR : F1:%d F2:%d (byte)\n", n1, n2);
                }
             }
          }
       }
       return err;
    }
     
    static int comparerFichiersBinairesTypeDouble (FILE * fic1, FILE * fic2,
                                                   double epsilon)
    {
       int err = 0;
       double n1, n2;
     
       while (!err && fread (&n1, sizeof (double), 1, fic1) == 1)
       {
          if (fread (&n2, sizeof (double), 1, fic2) == 1)
          {
             if (fabs (n2 - n1) > epsilon)
             {
                err = 1;
                printf ("ERR : F1:%g F2:%g (double)\n", n1, n2);
             }
             if (errno)
                perror ("fabs");
          }
       }
       return err;
    }
     
    static int comparerFichiersBinairesTypeFloat (FILE * fic1, FILE * fic2,
                                                  double epsilon)
    {
       int err = 0;
       float n1, n2;
     
       while (!err && fread (&n1, sizeof (float), 1, fic1))
       {
          fread (&n2, sizeof (float), 1, fic2);
          if (fabs (n2 - n1) > epsilon)
          {
             err = 1;
             printf ("ERR : F1:%g F2:%g (float)\n", n1, n2);
          }
     
          if (errno)
             perror ("fabs");
       }
       return 0;
    }
     
    static int comparerFichiersBinairesType (char *nomf1, char *nomf2,
                                             int nbOctet, double epsilon)
    {
       FILE *fic1 = fopen (nomf1, "rb");
       if (fic1 != NULL)
       {
          FILE *fic2 = fopen (nomf2, "rb");
          if (fic2 != NULL)
          {
             int err = 0;
             if (nbOctet == 1)
             {
                err = comparerFichiersBinairesTypeByte (fic1, fic2);
             }
             else if (nbOctet == 4)
             {
                err = comparerFichiersBinairesTypeFloat (fic1, fic2, epsilon);
             }
             else
             {
                err = comparerFichiersBinairesTypeDouble (fic1, fic2, epsilon);
             }
             fclose (fic2);
     
             if (err)
             {
                // Fonction gererErreur
                printf ("Erreur de comparaison entre %s et %s\n", nomf1, nomf2);
                //system("! sh TnrMge.sh $ERR_FICHIERBINDIFF && exit $ERR_FICHIERBINDIFF");
             }
             else
             {
                printf ("Les fichiers %s et %s sont identiques\n", nomf1, nomf2);
             }
          }
          else
          {
             perror (nomf2);
          }
          fclose (fic1);
       }
     
       else
       {
          perror (nomf1);
       }
     
       return 0;
    }
     
    int main (int argc, char *argv[])
    {
       if (argc > 4)
       {
          printf ("%s %s %s %s\n", argv[1], argv[2], argv[3], argv[4]);
          comparerFichiersBinairesType (argv[1], argv[2], atoi (argv[3]),
                                        atof (argv[4]));
       }
       else
       {
          puts ("erreur parametres");
       }
       return 0;
    }
    Essaye le tel quel.

    Pose des questions si tu ne comprends pas.

    Tu es bien consciente que le format binaire des données de type float et double peut changer d'une machine à l'autre et que la comparaison binaire n'est pas portable. Quand à la comparaison en valeur, elle peut aussi changer...

    Bref, si les fichiers n'ont pas été créés dans le même conditions, la comparaison peut ne pas fonctionner, même si les valeurs sont 'identique' (à epsilon près).

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    EDIT : J'ai réparé tout le code (et réorganisé le codage, il faut apprendre à factoriser...)

    Tu es bien conscient que le format binaire des données de type float et double peut changer d'une machine à l'autre et que la comparaison binaire n'est pas portable. Quand à la comparaison en valeur, elle peut aussi changer...
    Effectivement, j'en suis consciente, le but du jeu c'est d'effectuer des tests de non régression entre deux versions d'un outil. En sortie il y a de l'ascii ou du binaire. Pour le binaire, l'outil produit et produira toujours trois type de fichiers byte (1 octet), float (4 octets) et double (8 octets). Ca me fait penser que je devrais entrer en dur la taille dans le fread plutot que de faire un sizeof qui lui pourra varier d'une machine à une autre.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Bref, si les fichiers n'ont pas été créés dans le même conditions, la comparaison peut ne pas fonctionner, même si les valeurs sont 'identiques' (à epsilon près).
    Je considère que oui dans mon cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de portabilité d'un programme avec tkinter et matplotlib
    Par rafoim dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 13/11/2013, 11h52
  2. Problème d'execution du programme
    Par black is beautiful dans le forum Windows
    Réponses: 1
    Dernier message: 31/03/2006, 21h24
  3. Problème de portabilité vers Mac OS?
    Par doudoustephane dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/08/2005, 07h53
  4. problème de Portabilité (erreur 1407)
    Par cgMorpheus dans le forum MFC
    Réponses: 3
    Dernier message: 06/03/2005, 21h00
  5. Problème de portabilité nmake / make
    Par Dozer dans le forum Systèmes de compilation
    Réponses: 3
    Dernier message: 25/01/2005, 22h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo