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 :

Compression Huffman - Maps


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut Compression Huffman - Maps
    Bonjour à tous,

    Dans le cadre d'un exercice de cours, je suis amené à créer un programme de compression/décompression selon l'algorithme de Huffman.

    Mon problème est le suivant, le programme est quasi fonctionnel, sauf que ALEATOIREMENT le fichier de destination ne retranscrit pas de manière
    uniforme le fichier source (ajout de caractère en fin de fichier de type .txt...). Cela vaut de même pour les fichiers de type bitmap qui sont retranscrits
    en ayant des octets en plus, une différence minime, mais une différence quand même.

    J'ai utilisé des map pour le calcul des fréquences et la construction de l'arbre et je veux rester dans l'optique de mon implémentation, sauf que j'aimerais que cela soit à 100% fonctionnel, et je n'arrive pas à trouver l'erreur.

    Plusieurs choses qui me paraissent étranges :
    -Les octets en plus dans mon fichier de destination.
    Est-ce un problème au niveau de la construction de l'arbre? Pourtant mes fonctions d'affichages des maps, montrent que j'ai correctement créer l'arbre
    -Pourquoi cela influence-t-il EXCLUSIVEMENT QUE la fin du fichier texte quand il s'agit d'un fichier texte.
    -Lors de l'utilisation de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void createForest(mapFq & mapFq, mapFrt & mapFrt){
        map<unsigned char,unsigned>::iterator it = mapFq.begin();
        while(it != mapFq.end()){
            HuffTree ht = treeFromFreq(it->first);
            mapFrt.insert(std::make_pair(ht, it->second));
            ++it;
        }
    }
    La map des arbres devrait avoir le même ordre que celle de fréquences, cependant ce n'est pas le cas, (utilisation des fonctions d'affichage)

    Pour tester l'executable, après l'avoir compilé, il faut le faire via le cmd dans le Debug,
    Dans mon cas
    cd Desktop/Huff/bin/Debug
    compression = Desktop/Huff/bin/Debug>huffman -c test.txt huff
    décompression = Desktop/Huff/bin/Debug>huffman -d huff test2.txt

    Cela devrait marcher sur les images bitmap aussi, la différence d'octet est plus prononcée.

    Voila si vous pouviez m'aiguiller dans la résolution de mon problème je vous serais reconnaissant.
    Merci d'avance et merci pour le tuto sur Huffman qui m'a beaucoup aidé!

    Huff.zip

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 521
    Par défaut
    Il dit quoi le débogueur ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut
    Il ne trouve aucun bug, le programme compile correctement,
    je précise que je suis sous CodeBlocks 13.12 avec le
    compilateur :
    GNU GCC Compiler
    avec les options cochées :

    Produce debugging symbols
    Enable all common compiler warnings (overrides many other settings)
    Enable extra compiler warnings
    Have g++ follow the coming C++0x ISO C++ language standard

    Voila Merci

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Je parie sur un pointeur ou un itérateur mal surveillé.

    Tu n'aurais pas un while(feof())?
    Tu n'aurais pas oublié d'initialisé une variable?

    Vérifie que tu as activé un maximum de warnings possibles (par exemple, pour gcc, -Wall -Wextra est un minimum).
    Edit: pour ce point là, c'est bon.

    Par contre, je trouve bizarre qu'il parle de C++0x, et pas de C++11.
    regarde ce que dis cet article (https://mementolinux.wordpress.com/2...s-sur-windows/)

    Vérifie que les fichiers sont ouverts en mode binaire (en mode texte, windows fait joujou avec les \r et les \n)

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 521
    Par défaut
    Il ne trouve aucun bug, le programme compile correctement,
    J'ai dis le débogueur, pas le compilateur !
    Vous pourrez ainsi surveiller ce qui est envoyé aux primitives d'écriture de fichier et de savoir d'où viennent ces cochonneries.
    Et cela sans se prendre la tête sur votre code.

  6. #6
    Membre éprouvé
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Par défaut
    Bonjour SkullOne001,

    je n'ai pas regardé le code mais je pense que tu as un problème avec tes fonctions encodage/décodage...

    Si tu testes avec un fichier très simple comme a tu constateras que la sortie après encodage/décodage est

    en hexa: 0x61 => 0x00000001 0xc2 => 0xd1 0x81

    et avec abcd on obtient aaaa
    EDIT : Désolé, j'ai un problème avec mon éditeur hexa

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut
    En effet, il y avait une erreur au niveau de mon flushBits, j'ai apporté la modification suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void flushBits(oBitFile & obf) {
        if(obf.n > 0) obf.fileOut.put(obf.oBuffer);
    }
    L'application rend bien le abcd correctement.

    Je viens de trouver l'erreur en plus, elle s'appellait INITIALISATION DE VARIABLE !

    Le Byte a devait être initialisé à 0, pour que l'application fonctionne correctement.

    Chose o combien basique mais importante pour un informaticien en C++ !
    Je me sens drôlement bête maintenant

    Merci à tous, qui m'avez permis chacun à votre de manière de me faire penser aux bonnes questions

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

Discussions similaires

  1. Compression Huffman en c.
    Par fred61 dans le forum Débuter
    Réponses: 14
    Dernier message: 11/08/2009, 14h05
  2. compresser avec l'executable de huffman
    Par memo07 dans le forum C++Builder
    Réponses: 0
    Dernier message: 30/11/2007, 01h47
  3. Réponses: 16
    Dernier message: 07/05/2006, 13h19
  4. Compression Huffman.Exception de SE.
    Par niko.nik2 dans le forum Langage
    Réponses: 2
    Dernier message: 05/05/2006, 09h32

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