Bien le bonjour !
Alors pour faire court, je faisait une petite classe permettant de coder un texte (en fait de le compresser) par la méthode d'Huffman, rien de bien compliqué.
Je ne suis pas sûr de mon algo, mais là n'est pas le problème.
En effet, je compile et tout se passe à merveilles, sauf que arrivé à un point du prog, ça plante (j'ai un beau message windaube ^^ : xxxx.exe a rencontré un problème et doit fermer...) systématiquement au même endroit.
J'ai pensé à un souci de pointeur ou qqchose dans le genre, mais le compilo ne bronche pourtant pas...
Précisions :
IDE -> Dev-C++ 4.9.9.2
OS -> WinXP
APP -> Appli DOS (donc pas de Framework)
Voilà les codes de mon main, mon code_huffman.h et .cpp :
main.cpp
code_huffman.h
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 #include <iostream> #include <string> #include "code_huffman.h" #include "decode_huffman.h" using namespace std; int main() { string phrase; Code code; cout << "***** Entrer la phrase a coder *****" << endl << endl; getline(cin, phrase); code.coder(phrase); system("PAUSE"); return EXIT_SUCCESS; }
code_huffman.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef CODE_HUFF #define CODE_HUFF class Code { public: Code(); void coder(std::string phrase); private: char m_phrase_base[]; }; #endif
une idée sur le pourquoi du comment ?
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 #include <iostream> #include <string> #include <vector> #include "code_huffman.h" using namespace std; Code:: Code() { } void Code:: coder(string phrase) { strcpy(m_phrase_base, phrase.c_str()); cout << "Vous avez saisi : \"" <<m_phrase_base <<"\"" << endl; cout << "Codage en cours..." <<endl; int taille=strlen(m_phrase_base); // on récupère la taille de la chaine char tab_char[]= ""; // pour stocker les lettre "noeuds" de l'arbre d'Huffman vector <int> tab_occur; // nombre d'occurences des noeuds int pos_tabs=0; // position dans tab_char et dans le vecteur for(int i=0; i<taille; i++) // parcours de la chaine de caractères { if(i==0) // premier caractère { tab_char[pos_tabs]= m_phrase_base[i]; tab_occur[pos_tabs]= 1; } else { int j=i-1; // indice de parcours du tableau de noeuds bool ajouter_char= true; // permet de savoir si on a un nouveau noeud à ajouter ou pas do { if(m_phrase_base[i]!=tab_char[j]) // teste si l'on a pas encore rencontré le caractère // en comparant au tableau de noeuds { j--; // si c'est le cas on compare avec le reste du tableau } else { j=0; // sinon on arrête de comparer ajouter_char= false; tab_occur[j]+= 1; // et on rajoute une occurence au noeud en question } } while(j>0); if(ajouter_char) // ajout d'un noeud { pos_tabs++; tab_char[pos_tabs]= m_phrase_base[i]; tab_occur[pos_tabs]+= 1; } } } // affichage du tableau de noeuds for(int i=0; i<pos_tabs; i++) cout << tab_char[i] << " | "; cout << endl; // affichage du vecteur d'occurences for(int i=0; i<pos_tabs; i++) cout << tab_occur[i] << " | "; }
Partager