Bonjour à tous. Je viens poster ici car je suis confronter à un bug d'un autre monde. Mais d'abord place au code:
Voila donc mon programme. Son but est simple, encoder une grille de Sudoku avec le minimum de place. Une grille est représentée par deux ligne ASCII, la premiere presente les chiffres visibles ou un point si cachés. La seconde la grille complete.
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 #include <iostream> #include <fstream> #include <string> using namespace std; int solution[81]; bool visible[81]; char mask1 = 1 << 7; char mask8 = 1; unsigned char convertToByte(int value) { unsigned char byte = 0; for (int temp = 0; temp < 4; temp++) { if (value % 2) { byte |= mask1; } byte >>= 1; value /= 2; } byte <<= 1; return byte; } int main(int argc, char **argv) { std::ifstream input(argv[1]); std::ofstream output(argv[2]); if (input.fail()) { cout << "File \"" << argv[1] << "\" not found.\n"; } while (!input.eof()) { std::string lineV, lineS; input >> lineV; input >> lineS; if (lineV.size() == 0 || lineS.size() == 0) { break; } unsigned char bufferTemp = 0; char buffer = 0; int byteCount = 0; int count = 0; for (int temp = 0; temp < 81; temp++) { if (count == 26) { return 0; } if (count >= 23) { cout << "buffer = " << (int)buffer << "\nbytecount = " << byteCount << "\n"; } visible[temp] = (lineV[temp] != '.'); char charTemp; charTemp = lineS[temp]; solution[temp] = atoi(&charTemp); if (count >= 23) { cout << "J\'ajoute " << solution[temp] << "\n"; } bufferTemp = convertToByte(solution[temp]); if (count >= 23) { cout << "\tQui en byte donne : " << (int)bufferTemp << "\n"; } if (visible[temp]) { bufferTemp |= (mask8 << 3); } if (count >= 23) { cout << "\tApres byte de visibilite on a : " << (int)bufferTemp << "\n"; } buffer |= (bufferTemp >> byteCount); if (count >= 23) { cout << "\tApres decalage : " << (int)buffer << "\n"; } byteCount += 5; if (byteCount >= 8) { if (count >= 23) { cout << "\tJ\'ecrit : " << (int)buffer << "\n\t c'est le chiffre " << count + 1 << "\n"; } //output.seekp(count); output.write(&buffer, 1); count++; buffer = 0; byteCount -= 8; buffer |= (bufferTemp << (5 - byteCount)); } } //output.seekp(count); output.write(&buffer, 1); } input.close(); output.close(); return 0; }
Je parse donc mon fichier et j'encode chaque chiffre sur 5 bites, 4 pour le chiffre et 1 pour savoir s'il est visible ou non.
Jusque la tout marche nickel mais pour cette exemple je suis confronté a un bug qui dépasse ma compréhension. Pour la grille suivante:
pour le 38ieme chiffre on a un 9 visible suivit d'un 4 et un 5 caché. Le 9 ne permet pas de remplir un octet, donc rien n'est ecrit dans cette boucle. à la boucle suivante, on complete avec une partie des bites du 4 et on ecrit l'octet correspondant au caractere 77. il reste alors dans le buffer 3 bites.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 48....2..2..43..1..1.7...93....7.3...9..1.......2.6......32...13..9.8.2...8..1... 483169275279435816615782493162874359894513762537296148946327581351948627728651934
Attention la magie arrive. Au tour d'apres, je prend les 5 bites du chiffre 5 ce qui fait 8 et j'ecrit mon octet. il s'agit du caractere 10. Or si on regarde le fichier resultat, il a ecrit un octet en plus juste avant. Ce dernier ne viens de nul part, completement incroyable. Apres le reste continue normalement mais un octet est venu s'inserer par magie.
Si quelqu'un peu m'expliquer pourquoi, je lui en serrai eternellement reconnaissant :p.
Pour exécuter ce code, il suffit de mettre en premier argument un fichier texte avec les chiffres des grilles collés dedans et en 2ieme argument le fichier de sortie
Partager