begin process at 2008 07 06 01:27:51
1 205 425 membres
7 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[C++/WIN32] COMPRESSEUR/DECOMPRESSEUR LZW


Description

Ceci est un compresseur/décompresseur de fichiers utilisant l'algo de Lempel, ziv et welch avec la particularité de ne nécessiter aucun fichier additionnel, il construit son propre dictionnaire. Cette version est un peu lente sur de gros fichiers mais impressionnante avec les fichiers texte (un XML de 200ko réduit à 40ko !)
Utilise des classes template pour tableau en adressage dispersé (hashTable) et chaine de bits.
L'interface est un dialog Win32.
(fait avec Vstudio 2003)

Conclusion

Un grand merci a Jean-Pierre Fournier et son étonnant "algorithmique objet" pour les tris et les structures de données.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de BruNews le 16/12/2006 00:29:28 administrateur CS

    Si j'écarte les bmp, exe fait 190 Ko avec une simple dialog.
    Je pense qu'il y a un rapport direct avec la présence des <stream>. Drole d'idée d'aller mettre ce genre de poids lourds dans du code API.
    Regarde la différence:
    http://www.cppfrance.com/code.aspx?ID=39145
    30 Ko tout compris, c'est donc 26.5 qu'on ajoute à un prog pour y mettre compression décompression.

  • signaler à un administrateur
    Commentaire de max12 le 16/12/2006 00:30:02 administrateur CS

    Tu éprouves des problèmes de lenteurs sur les gros fichiers, c'est normal et je crains qu'il soit difficile de faire mieux, même sur freeimage (qui utilise LZW pour GIF) la compression de gros fichier est beaucoup trop lente pour le temps réel.

    J'apportait simplement une précision :)

    A+

  • signaler à un administrateur
    Commentaire de yann_lo_san le 16/12/2006 00:55:49

    BruNews, je sais que tu attaches beaucoup d'importance au énormes et méchants kiloOctets, mais la raison est simple, la facilité d'utilisation des stream et surcharge d'operateurs. (enfin pour moi...)
    Mais je tiendrais compte de ta remarque.
    Tchao.

  • signaler à un administrateur
    Commentaire de BruNews le 16/12/2006 01:08:21 administrateur CS

    Le prob c'est que la taille reflète les détours que fait le code, le compilo entre dans l'exe ce qui est utilisé et rien de plus.
    La compression est le sujet typique qui évacue toute philo, la vitesse est primordiale.

  • signaler à un administrateur
    Commentaire de yann_lo_san le 16/12/2006 01:16:26

    BruNews > Après lecture de ton code bnZip, je crains de ne devoir dire qu'il est illisible, c'est un code perso qui n'interesse que celui qui le fait, sans commentaires, sans structures logiques, certe il est surement efficace (même si j'ai pas réussi à l'utiliser) mais qui va apprendre quelque chose de ces gros blocs d'assembleurs qu'on dirait copié colé du debuger microsoft.
    Enfin bref, la rapidité c'est pour les pros, le ludique et le fun est plus appréciable, sinon le soir c'est comme au boulot.

  • signaler à un administrateur
    Commentaire de BruNews le 16/12/2006 01:28:49 administrateur CS

    oh ben non alors, tu chipotes.

    // ECX = pmem, EDX = v, [esp+4] = len
    j'ai mis 2 fois ce super commentaire...

    Plus sérieux: il est clair que j'ai fourni du prêt-à-l'emploi, impensable de commenter ce genre de bestiau, faudrait une secrétaire à temps plein.

  • signaler à un administrateur
    Commentaire de cosmobob le 16/12/2006 11:59:33

    salut,
    destructeurs virtuels = âneries sur les classes qui sont pas polymorphiques. Tu forces la création d'une table virtuelle pour chaque objet de ces classes alors qu'il n'y en a pas besoin :p
    sinon le code est bien, mais je comprends pas pourquoi tu utilises pas std::string et std::vector au lieu de créer tes propres templates Chaine et TableauGen (ok je comprends le but didactique, mais ce genre de trucs est une énorme source d'erreurs)
    ta source est intéressante en tout cas ;)

  • signaler à un administrateur
    Commentaire de yann_lo_san le 16/12/2006 14:06:53

    COSMOBOB > Le destructeur virtuel me sert par exemple dans HashTable qui est dérivé de TableauGen à rajouter un attribut "tab dynamique de bool" et à pouvoir le détruire.
    En fait il permet juste aux classe dérivées de gérer des attributs dynamique en plus de la classe de base.
    En gros, il ne gène pas s'il est mis mais peut faire défaut s'il n'y est pas.
    La vtable n'est-elle pas créée même si pas de destructeur virtuel ???
    Enfin, j'ai besoin d'étendre la classe Chaine et je ne connais pas bien std::string.
    Idem pour vector, mais tu as raison, j'aurais pu étendre directement un vector<>.
    Merci de ton interet en tout cas.

  • signaler à un administrateur
    Commentaire de yann_lo_san le 16/12/2006 15:05:00

    Précision : (thinking c++)
    Forgetting to make a destructor virtual is an insidious bug because it often doesn’t directly affect the behavior of your program, but it can quietly introduce a memory leak.
    Also, the fact that some destruction is occurring can further mask the problem.
    Even though the destructor, like the constructor, is an exceptional function, it is possible for the destructor to be virtual because the object already knows
    what type it is (whereas it doesn’t during construction).
    Once an object has been constructed, its VPTR is initialized, so virtual function calls can take place.
    Ex :
    Shape class includes a virtual destructor,
    something you should automatically add to any class with virtual functions.
    If a container holds pointers or references to Shape objects, then when the virtual destructors are called for those objects everything will be properly cleaned up.

  • signaler à un administrateur
    Commentaire de cosmobob le 16/12/2006 15:15:52

    salut,
    je ré explique ce que j'ai dit. t'as pas besoin de destructeur virtuel si t'as aucune autre fonction virtuelle dans ta classe (c'est à dire classe non polymorphique), comme c'est le cas de tes classes Tableau et HashTable.
    et effectivement, la vtable n'est pas créée quand ta classe ne possède aucune fonction virtuelle.
    Rajouter le destructeur virtuel est de la responsabilité de la première personne qui rajoute une fonction virtuelle à la classe.

    Je n'ai *pas* dit qu'il ne fallait pas de destructeur virtuel dans une classe polymorphique (car effectivement ça expose à des bugs insidieux comme l'explique l'article que tu as cité), mais je dit que ça sert à rien dans une classe sans autre fonction virtuelle. Et ça a tendance à mystifier le concept puisqu'il devient utilisé même quand il ne sert à rien (à part à augmenter pour rien la taille de chaque objet (à cause de la vtable en plus)).

  • signaler à un administrateur
    Commentaire de cosmobob le 16/12/2006 15:27:02

    et dans ce que tu dis, tu fais une légère confusion.

    Tu aurais besoin d'un destructeur virtuel, si à un moment dans ton code, tu voyais un objet HashTable* comme un objet Tableau*.
    C'est à dire si tu avais quelque chose comme ça:
    // quand on fait ça, mieux vaut un desctructeur virtuel
    // dans Tableau
    Tableau<T>* tab = new HashTable<T, string>;

    Mais si tu faisais ça, il y aurait un léger problème conceptuel car ta classe de base ne possédant aucune autre fonction virtuelle, et donc quoique tu fasses, ton tab se comporterait comme un Tableau<T> et pas comme un HashTable.
    Tu aurais donc une perte d'information à faire ça plutôt qu'à faire directement:
    HashTable<T, string>* tab = new HashTable<T, string>;

    Donc dans ton cas, comme tu ne voudras jamais considérer une HashTable comme un Tableau, tu peux enlever le destructeur virtuel, je t'assure que t'auras aucune fuite de mémoire...

    ça montre quand même que le concept est pas super clair chez toi.

  • signaler à un administrateur
    Commentaire de yann_lo_san le 16/12/2006 16:24:39

    Le VPTR ne fait que la taille d'un pointeur void, alors je veux bien récupérer 4 octets pour te faire plaisir, mais rien ne gène à avoir un destructeur virtuel sans polymorphisme.
    Et qui te dis que je n'étendrais pas la classe HashTable plus tard ou dans un autre algo, alors il faudra remonter d'un niveau.
    Mais j'ai bien compris ta remarques, pour l'instant, il ne sert à rien du tout.

  • signaler à un administrateur
    Commentaire de magic_Nono le 18/12/2006 14:45:47

    une petite remarque quant à l'interface, qui a l'aire tres réussie dans le shoot,
    en fait l'exe n'integre pas de manifest, donc
    rien à voir une fois qu'on lance l'exe...

    et sur mon poste (XP SP2 FR, les images dépassent mm de leur cadre et vont gagner sur les boutons...)


    enfin, drole d'idée que l'usage des stream ici; je respecte ce choix même si je ne le ferai pas mien

    Magicalement Bonne Prog
    Nono.

  • signaler à un administrateur
    Commentaire de yann_lo_san le 18/12/2006 18:53:03

    MAGIC_Nono > Peut tu m'en dire plus sur ce manifest, j'utilise toujours VS 2002, cela parait bizarre que l'interface change à ce point !

    Pour les stream petit exemple :
    hChaine += octet; // + de 10 lignes de C avec API
    entree >> chaineDeBits; // j'imagine même pas avec API  

    A plus...

  • signaler à un administrateur
    Commentaire de vecchio56 le 20/12/2006 23:27:42 administrateur CS

    Pareil que magin_nono:
    http://img296.imageshack.us/img296/3196/1wk5.png

    Manifestement c'est pas un problème de manifest

  • signaler à un administrateur
    Commentaire de magic_Nono le 21/12/2006 08:42:22

    non, je pense que le fait qu'il soit bien vient de la config particuliere de son ordi (police spécifique, tailles...)

    voilà ce que ça donnerait avec manifest,

    http://img86.imageshack.us/my.php?image=compresslzwru6.jpg

    Yann ce n'est pas la solution à ton pb

    Magicalement votre




    <img src="http://img86.imageshack.us/img86/9636/compresslzwru6.jpg" border="0" />

    [IMG]http://img86.imageshack.us/img86/9636/compresslzwru6.jpg[/IMG]

    [url=http://img86.imageshack.us/my.php?image=compresslzwru6.jpg][img=http://img86.imageshack.us/img86/9636/compresslzwru6.th.jpg][/url]


    (différents essais d'intégration de l'image)

  • signaler à un administrateur
    Commentaire de yann_lo_san le 22/12/2006 01:14:02

    C'est quant même super bizarre cette histoire, c'est la première fois que ça m'arrive.
    Pour info, je suis sous XP pro avec aucunes polices spéciales ni rien de particulier, sauf l'habillage général en vieux windows et pas de thème XP.
    A plus...

  • signaler à un administrateur
    Commentaire de vecchio56 le 22/12/2006 08:59:48 administrateur CS

    On voit bien sur la capture que tu as une police spéciale
    La police par défaut est Tahoma (8)

  • signaler à un administrateur
    Commentaire de yann_lo_san le 22/12/2006 14:48:56

    VECCHIO56 > toute ma configuration xp est réglée sur Tahoma(8) et la police de boite de dialog est celle par défaut : MS Shell Dlg(8).

  • signaler à un administrateur
    Commentaire de vecchio56 le 22/12/2006 18:42:54 administrateur CS

    Compare avec ma capture, tu verra que la police est différente

  • signaler à un administrateur
    Commentaire de yann_lo_san le 22/12/2006 21:25:48

    Effectivement.
    Encore une entrée dans mon panthéon des mystères...
    (qui commence à être sacrément lourd !)
    A plus.

  • signaler à un administrateur
    Commentaire de zalson le 08/05/2007 18:32:41

    Merci du code.Mais comment le compiler?
    Merci d'avance

  • signaler à un administrateur
    Commentaire de yann_lo_san le 11/05/2007 23:43:42

    Et bien, je compile avec visual c++ 7 - 2002

    sinon il faut créer un makefile ou utiliser un autre compilateur c++ et gérer les différences non windows. Mais moi je n'utilise que visual, donc je ne peut pas t'aider.

  • signaler à un administrateur
    Commentaire de zalson le 12/05/2007 12:33:13

    Salut Yannick, je suis vraiment interessé par ton application sur l'algo LZW di compression et
    decompression.
    Mais je voudrais que tu m'expliques comment faire la compiltion parceque quand je compile ton application avec VisualC++2005 express Edition il me donne cette erreur: fatal error C1083: Cannot open include file: 'windows.h': No such file or directory
    Je t'envoie egalement le file BuildLog.htm
    J'attends ta reponse.
    Merci

  • signaler à un administrateur
    Commentaire de BruNews le 13/05/2007 01:41:20 administrateur CS

    http://www.cppfrance.com/code.aspx?ID=38359
    Si tu suis bien ce tuto d'installation de Visula C++ Express 2005, devrait ensuite compiler.

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS