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 :

Tableau & Structure


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut Tableau & Structure
    Bonjour,

    Je dois effectuer l'algorithme d'Huffman pour mon projet de fin d'étude.
    J'ai mon idée en tête, mais je me confronte à un problème. Voila mon code (simplifié):

    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
     
    main()
    {
     
      typedef struct Huff{
             struct Huff* lg;
             struct Huff* ld;
             char ascii;
             int freq;      
      };
    ....
      i=0;
      do
      {
          struct Huff *STRUCT[0][i];
          STRUCT[0][i]=(struct Huff *) malloc(sizeof(struct Huff)); 
          STRUCT[0][i]->ascii=(char)ASCII[0][i];
          STRUCT[0][i]->freq=(int)ASCII[1][i];
          STRUCT[0][i]->lg=NULL;
          STRUCT[0][i]->ld=NULL;
          printf("%c\t %d \n",STRUCT[0][i]->ascii,STRUCT[0][i]->freq);
          i++;
     
      }while(ASCII[1][i]!=0);
    Ce code fonctionne parfaitement.
    Seulement, si je rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         printf("%c\t %d \n",STRUCT[0][2]->ascii,STRUCT[0][2]->freq);
    Ce qui est pour moi sensiblement idendicte à ce que j'ai écrit avant, cela m'affiche l'erreur suivante :
    invalid type argument of '->'

    Si quelqu'un pouvait m'aider, je lui en serais très reconnaissant

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Ton erreur n'est pas là où tu crois, et ce genre d'erreurs arrive toujours lors d'une mauvaise utilisation de la mémoire...

    Quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          struct Huff *STRUCT[0][i];
    Tu définis un tableau à 2 dimensions dont la première est .. nulle... et la deuxième... inconnue....

    Primo, pourquoi veux-tu faire à 2 dimensions ??

    Ensuite, si tu veux faire comme ça, fais plutôt :

    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
     
        /* Définir un double pointeur, pour avoir un tableau à 2 dimensions */
     
         struct Huff **STRUCT=NULL;
     
     
         /* Allouer la première dimension (ici 1 seul élément) */
     
         STRUCT=(struct Huff **) malloc(sizeof(struct Huff*)); 
         if ( STRUCT == NULL )
           return ERROR ;
     
     
         /* Allouer la deuxième dimension (ici pouvant contenir (i+1) éléments) */
     
         STRUCT[0] =(struct Huff *) malloc((i+1)*sizeof(struct Huff)); 
         if ( STRUCT[0] == NULL )
           return ERROR ;
     
     
        /* Remplissage du dernier élément du tableau (tel que tu indiquais vouloir le faire plus haut) */
     
        STRUCT[0][i] = ....

  3. #3
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    Pour le tableau à 2 dimensions, tu as parfaitement raison. C'est assez inutile. Mais je ne comprends pas le code que tu me conseilles de faire. Pourrais tu me le commenter s'il te plait?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Bon je t'ai mis les commentaires dans le code de mon post précédent..

    Sinon également un conseil, pour éviter d'avoir à écrire struct à chaque fois.

    Au lieu de déclarer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          typedef struct Huff{
             struct Huff* lg;
             struct Huff* ld;
             char ascii;
             int freq;      
      };
    Il suffit de déclarer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      typedef struct P_Huff{
             struct P_Huff* lg;
             struct P_Huff* ld;
             char ascii;
             int freq;      
      } Huff ;
    Et ensuite tu t'y réfères comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          Huff STRUCT;
     
          STRUCT.ascii=(char)ASCII[0][i];
          ....

    Et je re-pose la question :

    Pourquoi te sers-tu d'un tableau à 2 dimensions ??

  5. #5
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    J'avais besoin d'un tableau à 2 dimensions pour mettre le caractère et sa fréquence.
    Mais la structure à 2 dimensions est inutile, tu as raison.
    Ca me met toujours la même erreur.
    Le code que tu m'as mis est pour un tableau à 2D ?
    Vu que j'ai modifié pour un tableau 1D, j'ai peur d'avoir fait des erreurs mais j'en doute.

    C'est pas très clair ce que j'ai dit.
    En fait j'ai un tableau ASCII à 2D pour la caractere et pour la fréquence du caractère.
    Et je veux faire une structure pour chaque caractere.
    Mais je n'ai pas besoin de 2D pour ma structure, comme tu me l'as fait remarquer.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par irons
    Le code que tu m'as mis est pour un tableau à 2D ?
    OUI

    Citation Envoyé par irons
    Vu que j'ai modifié pour un tableau 1D, j'ai peur d'avoir fait des erreurs mais j'en doute.
    Mets voir ton code...

  7. #7
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    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
     
      i=0;
      do
      {
     
     
         struct Huff *STRUCT=NULL;
     
         STRUCT=(struct Huff *) malloc(sizeof(struct Huff)); 
         if ( STRUCT == NULL )
         return ERROR ;
     
     
     
          //arbre ASCII[0][i];
          STRUCT[i]=(struct Huff *) malloc(sizeof(struct Huff)); 
          STRUCT[i]->ascii=(char)ASCII[0][i];
          STRUCT[i]->freq=(int)ASCII[1][i];
          STRUCT[i]->lg=NULL;
          STRUCT[i]->ld=NULL;
          printf("%c\t %d \n",STRUCT[i]->ascii,STRUCT[i]->freq);
          i++;
     
      }while(ASCII[1][i]!=0);

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Déjà une remarque...

    Avec ton code tel qu'il est, tu écrases STRUCT à chaque passage, ce qui n'est pas, je pense, ce que tu veux faire...

    Ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          STRUCT[i].ascii=(char)ASCII[0][i];
          STRUCT[i].freq=(int)ASCII[1][i];
          STRUCT[i].lg=NULL;
          STRUCT[i].ld=NULL;
          printf("%c\t %d \n",STRUCT[i].ascii,STRUCT[i].freq);
    C'est un tableau de structures, par un tableau de pointeurs...

  9. #9
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    Je suis désolé mais je comprends vraiment pas.
    J'ai toujours une erreur dès que je rajoute une ligne.
    Comment tu créerais mes structures dans mon while?

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ton code est assez incohérent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     i=0;
      do
      {
          struct Huff *STRUCT=NULL;
          STRUCT=(struct Huff *) malloc(sizeof(struct Huff)); 
          if ( STRUCT == NULL )     return ERROR ;
           //arbre ASCII[0][i];
          STRUCT[i]=(struct Huff *) malloc(sizeof(struct Huff));
    - Le premier malloc demande la création d'UNE structure. STRUCT[i]=... plantera dès que i sera différent de 0 et de toute façon est du type struct pas pointeur sur struct
    - au passage suivant du while, tu écrases la valeur de STRUCT précédemment obtenue. Comme tu ne l'a pas sauvegardée qq part, elle est perdue à jamais.
    - la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STRUCT[i]=(struct Huff *) malloc(sizeof(struct Huff));
    semble indiquer que tu souhaites que STRUCT soit un tableau de pointeur sur struct Huff. Tu créerais alors à chaque passage une nouvelle structure en mettant son adresse dans le tableau STRUCT.

    Que veux tu faire ?

  11. #11
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    Le tableau ASCII est un tableau à 2 dimension contenant le caractere et sa fréquence.
    Je veux créer une structure pour chaque caractere.
    Mon tableau ASCII est trié.
    Donc en faisant mon Do.. While, je créé pour chaque fréquence diffèrente de 0 une structure.
    Et je veux en effet que STRUCT soit un tableau de pointeur sur struct Huff.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Bon reprenons calmement ton code, avec les modifications ci-dessus :

    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
     
     typedef struct PHuff{
             struct PHuff* lg;
             struct PHuff* ld;
             char ascii;
             int freq;      
      } Huff ;
     
    main()
    {
    Huff *STRUCT=NULL, *tmp=NULL ;
    int     i =0;
     
     ...
     
      do
      {
          /* Alloue la place dans le tableau , avec cas particulier pour le premier élément */
          if ( i == 0 )
             {
                 STRUCT= malloc(sizeof(Huff));
                 if ( STRUCT == NULL )
                   {
                      fprintf ( stderr, "\n Erreur mémoire\n");
                      break ;
                   }
             }
          else
             {
                 tmp = realloc ( STRUCT,  ((i+1)*sizeof(Huff)) );
                 if ( tmp == NULL )
                    {
                       fprintf ( stderr, "\n Erreur mémoire\n");
                       break ;
                    }
                  STRUCT = tmp ;
             }
     
          /* Stocke et imprime la structure */
          STRUCT[i].ascii=(char)ASCII[0][i];
          STRUCT[i].freq=(int)ASCII[1][i];
          STRUCT[i].lg=NULL;
          STRUCT[i].ld=NULL;
          printf("%c\t %d \n",STRUCT[i].ascii,STRUCT[i].freq);
          i++;
     
      }while(ASCII[1][i]!=0);
    Et là en sortie du while tu as un tableau de structures Huff.

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Et je veux en effet que STRUCT soit un tableau de pointeur sur struct Huff.
    Dans ce cas (N étant le nombre maximum de structures)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     struct Huff ** STRUCT= malloc(N*sizeof(struct Huff*)); 
    if ( STRUCT == NULL )     return ERROR ;
    do
    {     //arbre ASCII[0][i];
        STRUCT[i]=malloc(sizeof(struct Huff)); 
          // Il faut  tester  STRUCT[i]
        STRUCT[i]->ascii=(char)ASCII[0][i];
          ....     
    }while(ASCII[1][i]!=0); // et tester i par rapport à N

  14. #14
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    Un grand merci souviron !!!!
    Ca marche
    ps : je suppose que tmp se déclare ainsi :

    Huff *tmp;

    Encore merci à toi !

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par irons
    Un grand merci souviron !!!!
    Ca marche
    ps : je suppose que tmp se déclare ainsi :

    Huff *tmp;

    Encore merci à toi !
    oui j'avais oublié de le mettre. Je corrige le code..

    Et de rien..

  16. #16
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    Je pense à un truc.
    lg et ld sont des pointeurs sur structure.
    Je peux les faire pointer vers une structure de mon tableau ?
    Par exemple :

    STRUCT[200].lg=STRUCT[1];
    STRUCT[200].ld=STRUCT[2];

    C'est possible de faire ça ?

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par irons
    Je pense à un truc.
    lg et ld sont des pointeurs sur structure.
    Je peux les faire pointer vers une structure de mon tableau ?
    Par exemple :

    STRUCT[200].lg=STRUCT[1];
    STRUCT[200].ld=STRUCT[2];

    C'est possible de faire ça ?
    oui mais pas comme ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        STRUCT[200].lg=&(STRUCT[1]);
        STRUCT[200].ld=&(STRUCT[2]);
    car ce doit être des POINTEURS sur des structures...

  18. #18
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    Et est ce que c'est possible de désalouer les structures.
    Dans mon exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    STRUCT[200].lg=&(STRUCT[1]);
    STRUCT[200].ld=&(STRUCT[2]);
    Ce que je voudrais faire c'est que STRUCT[1] et STRUCT[2] n'existe plus.
    A Part dans STRUCT[200].lg et STRUCT[200].ld
    ne marche pas à mon avis, tu en penses quio ?

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    j'en pense qu'il faut que tu révises tes notions de pointeurs....

    Si tu libères tes Structs[1] et de 2, tes pointeurs .g .d ne pointeront donc plus vers une zone de mémoire valide. Et comme ce sont des pointeurs, je ne vois pas en quoi ça te serait utile (ce n'est pas une copie du contenu, mais un raccorci pour aller au début du contenu...).

  20. #20
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Par défaut
    Ok.
    Merci pour tout.
    Je vais essayer de faire avec ce que j'ai et avancer mon projet au mieux.
    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/05/2006, 11h46
  2. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  3. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  4. Réponses: 9
    Dernier message: 13/02/2006, 08h39
  5. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 17h28

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