Bonjour. J'ai un programme qui fonctionne très bien sous linux, compilé avec GCC. Avec Cygwin, rien ne va plus.
Je voudrai savoir si ça peut être du à des caracteres interprétés différemment sous windows et linux, tels que '\r', par exemple...
Vraiment je suis perdu.
Voilà les différents fichiers concernés en pièce jointe.
Quelques remarques sur le problème :
- Je fait souvent des conversions char->unsigned char pour indexer mon tableau qui regroupe les occurences de chaque caractere. Ainsi chaque case est indexée par le code octal du caractere en question.
- Le code binaire que j'écris est codé unsigned char par unsigned char et ensuite écrit dans le fichier de codage avec fputc(char_to_write, fp_encoded) ;.
- En fait, je vois que le fichier binaire d'encodage est d'ors et déjà différent que le fichier encodé sous Linux. Le fichier sous linux fait 515 octets, et 511 octets avec Cygwin. Donc le résultat final ne peut pas être le même. Le problème si situe peut être dans l'encodage du fichier.
- La table des occurences est différente sous Linux et Windows :
On a trois caracteres en plus qui sont lus sous Linux, et pas sous Windows. Quésaquo ? Le morceau de code concerné par le comptage des caracteres :
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 $ diff -u baudelaire.txt.htab bin/Debug/baudelaire.txt.htab --- baudelaire.txt.htab 2009-04-07 13:11:59.257534500 +0200 +++ bin/Debug/baudelaire.txt.htab 2009-04-07 12:45:29.080934500 +0200 @@ -4,6 +4,8 @@ 44 16 45 2 46 6 + 59 1 + 65 1 67 2 68 3 69 11 @@ -38,4 +40,5 @@ 121 1 160 2 169 10 +174 1 195 13
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 unsigned char index ; char * istring ; huffman_tree leaves_tab[256] ; for ( i = 0 ; i < len_istring ; i++ ) { index = istring[i] ; /* on incremente le compteur de 1 a chaque occurence */ leaves_tab[index].count = leaves_tab[index].count + 1 ; }- Je poste ici la fonction principale responsable, n'hésitez pas à me demander si vous voulez que je poste plus de code.
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 #ifndef HUFFMAN_HEADER_H_INCLUDED #include "huffman_header.h" #endif void encode_string( const char * istring, huffman_tree * huffman_index, const char * filename ) { /* cette procedure prend une chaine istring en entree, l'encode a partir de l'index donne en argument, et ecrit le resultat de l'encodage dans le fichier filename*/ FILE * fp ; fp = fopen(filename, "w") ; #ifdef DEBUG puts("on entre dans encode_string") ; #endif if( fp != NULL ) { /* variables sur le mot binaire a encoder */ unsigned char index ; unsigned char pos_bit ; unsigned char pos_char ; unsigned int j ; /* variable sur la chaine d'entree */ unsigned int i ; /* variables sur la chaines de sortie (chaine encodee)*/ unsigned long int size_ofile ; /* ne depasse pas la taille du fichier de sortie en char*/ unsigned char obit_pos ; /* ne depasse pas 7 */ unsigned char char_to_write ; /* octet a ecrire dans le fichier */ unsigned char bit ; i=0 ; obit_pos = 0 ; size_ofile = 0 ; char_to_write = 0 ; while( istring[i]!='\0' ) { index = istring[i] ; /* index dans la table d'encodage du caractere istring[i] */ for ( j = 0 ; j<huffman_index[index].bit_size ; j++ ) { pos_bit = (j%CHAR_BIT) ; /* position du bit a ecrire */ pos_char = (j/CHAR_BIT) ; /* position de l'octet a ecrire */ bit = read_bit( pos_bit, huffman_index[index].bin_word[pos_char] ) ; char_to_write = write_bit(bit, obit_pos , char_to_write ) ; obit_pos = (obit_pos+1)%8 ; if( obit_pos == 0 ) { /* si cette valeur est un multiple de 8, on inscrit ce caractere et on passe au suivant */ putc(char_to_write,fp); char_to_write = 0 ; size_ofile ++ ; } } i = i + 1 ; } putc(char_to_write,fp) ; fclose(fp) ; fp=NULL ; #ifdef DEBUG puts("dans encode_string() :") ; printf( "la taille de la chaine initiale est de %u caracteres\n" , i ) ; printf( "la taille de la chaine finale est de %lu caracteres\n\n" , size_ofile+1 ) ; #endif } else { puts("impossible d'ouvrir le fichier dans encode_string") ; } #ifdef DEBUG puts("on sort de encode_string") ; #endif }
Partager