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 :

entete de comression Huffman avec fonction doublement recurssive


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2006
    Messages : 233
    Par défaut entete de comression Huffman avec fonction doublement recurssive
    Bonjour,

    Voila mon probleme : ayant un projet sur la compression de Huffman, j'ai décider de changer le format de l entete de mon fichier suite à un conseil donnée sur ce forum : http://www.developpez.net/forums/sho...d.php?t=312519
    Donc pour résumer je coder le bit '0' pour un nouveau noeud, '1' pour une feuille et je met le caractere ascii correspondant a la feuille apres les '1' donc.

    Ceux qui donne sur cette arbre par exemple:

    le code "001D01B01F1A01C1E" . Bien sur les 0 et les 1 sont des bits et les code ascii des caracteres seront codé sur un octet. Mais pour simplifier pour l'instant les 0 et les 1 sont codée en tant que caractere (cela évite de s'encombrer de l'utilisation d'une file d'attente pour écrire octet par octet dans le fichier).


    J'ai donc dévelloper la fonction pour ecrire l'entete de cette fonction (qui est fonctionnelle) mais ma fonction pour la recréation de l'arbre ne marche pas! C'est en quelques sorte une fonction doublement récursive (avec adresse du noeud actuelle dans l'arbre en construction et la position du pointeur sur fichier (FILE*) qui avance à chaque lecture (fread).

    Cette fonction marche pour les arbre à 3 niveau de profondeur (soit 2 noeuds) mais ne marche pour plus grand. Car dépassé cette limite, la lecture des valeurs de l'arbre me ferme mon programme. Pourtant lorsque je lit un emplacement mémoire interdit, windows me retourne un message d'erreur avant. Je précise que je développe sous "Dev C++". Bon sans plus attendre je met les code source donc vous aurez besoin et souhaite bonne chance au plus courageux (lol)

    SOURCE:

    DEFINITION DU TYPE ARBRE ET DE SON POINTEUR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct arbre_ arbre;
    typedef feuille *ptr_arbre;
     
    struct arbre_
    {
    unsigned char code_ascii;        
    ptr_feuille fils_gauche;
    ptr_feuille fils_droite;
    };


    FONCTION DEVANT RECREER L ARBRE AVEC EN ARGUMENT LE POINTEUR SUR FICHIER POINTANT AU DEBUT SUR LE DEBUT DE L ENTETE ET L ADRESSE DU NOEUD ACTUELLE EN DEUXIEME ARGUMENT

    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
    void creer_arbre(FILE *fichier_entree,ptr_arbre noeud)
    {
    unsigned char caract;
    if(!fread(&caract,sizeof(unsigned char),1,fichier_entree))    
    { printf("\n\nerreur entete fichier compresse"); while(1); }
    printf("caractere lu %c\n",caract);
    if(caract=='1')
    {
    if(!fread(&caract,sizeof(unsigned char),1,fichier_entree))    
    { printf("\n\nerreur entete fichier compresse"); while(1); }
    noeud->code_ascii=caract;
    printf("lettre a placer %c\n",caract);
    }
    else  //creation des deux fils
    {
    if(((noeud->fils_gauche)=(ptr_arbre)malloc(sizeof(arbre)))==NULL)
    { printf("\n\nErreur allocation memoire"); while(1); }  
    printf("noeud gauche creer\n");
    if(((noeud->fils_droite)=(ptr_arbre)malloc(sizeof(arbre)))==NULL)
    { printf("\n\nErreur allocation memoire"); while(1); }  
    printf("noeud droite creer\n");
    noeud->fils_gauche->code_ascii='H';
    noeud->fils_droite->code_ascii='H';
    noeud->fils_gauche->fils_gauche=NULL;
    noeud->fils_gauche->fils_droite=NULL;         
    noeud->fils_droite->fils_gauche=NULL;
    noeud->fils_droite->fils_droite=NULL;
    printf("depart fils gauche\n");
    creer_arbre(fichier_entree,noeud->fils_gauche);
    printf("depart fils droite\n");
    creer_arbre(fichier_entree,noeud->fils_droite);
    }
    }


    AUPARAVANT J'AI INITIALISER UNE FEUILLE POUR L'ARBRE A CONSTRUIRE AVEC LA FONCTION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ptr_arbre creer_feuille()
    {
    ptr_arbre inter;
    if((inter=(ptr_arbre)malloc(sizeof(arbre)))==NULL)
    { printf("\n\nErreur allocation memoire"); while(1); }  
    inter->code_ascii='H';
    inter->fils_gauche=NULL;
    inter->fils_droite=NULL;
    return inter;
    }


    J'AI DONC DANS LA FONCTION PRINCIPALE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ptr_arbre arbre_huffman=creer_feuille();
     
    //creation de l arbre simplifier avec entete
    creer_arbre(fichier_in,arbre_huffman);

    VOILA, si vous avez besoin de la fonction qui écrit l'entete a partir de l'arbre de la partie "compression de fichier" faite moi signe!

    Encore bonne chance et merci d'avance...

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2006
    Messages : 233
    Par défaut suite
    résolu sur un autre forum

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

Discussions similaires

  1. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  2. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52
  3. Réponses: 3
    Dernier message: 16/06/2004, 11h26
  4. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  5. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57

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