Erreur hors compilo - Codage d'Huffman
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:
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.h
Code:
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 |
code_huffman.cpp
Code:
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] << " | ";
} |
une idée sur le pourquoi du comment ?