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 :

Remplissage d'un tableau de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Par défaut Remplissage d'un tableau de structure
    Bonsoir et bonne année à tous,

    Je tiens à préciser que je débute donc si vous pouviez être indulgent avec mon pauvre code....

    Je souhaite remplir un tableau avec des éléments de structure selon ce modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct model {
      int indice;
      int taille;
      int *donnees;
    };
    Voilà les fonctions associées
    Fonctions.c

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "Fonctions.h"
     
    /* Création d'une variable de type générique */
    generique Creer_elem_generique(int c, int t)
    {
     generique element;
     element.clef = c;
     element.taille = t;
     element.donnees = calloc( t , sizeof(int));
     return element;
    }
     
     
    /* Copie de structures generiques (U <- S) avec copie de leurs données */
    generique Copie_elem_generique(generique S, generique U)
    {
     int i=0;
     U = Creer_elem_generique(S.clef,S.taille);
     for(i=0; i < S.taille; i++){
        U.donnees[i] = S.donnees[i];
     }
     return U;          
    }
     
     
    /* Remplissage d'un tableau contenant des éléments de type générique */
    void REMPLIR_tableau(generique *tableau, int taille_tab, int t_donnees,int Tri_entier)
    { 
     generique element = {0,0,NULL};
     int i=0,j=0,cle=0; 
       for(i=0; i < taille_tab; i++){
    	  printf("\n clef [%i] : ",i);
    	  scanf("%d",&cle);
    	  if(Tri_entier == 0){
    	     element = Creer_elem_generique(cle,t_donnees);
    	     for(j = 0; j < t_donnees; j++){
    		     printf("\n DONNEES [%i] : ",j);
    	         scanf("%d",&element.donnees[j]); 
             }
             Copie_elem_generique(element, tableau[i]);  /*problèmatique*/
             printf("\n t [%d] = %d",i,tableau[i].clef);         /*problèmatique*/
    	 printf("\n"); 
     
          }
       }	
    }
     
    /* Affiche la clef ainsi que les données numériques de chaque élément du tableau */
    void AFFICHER_elem(generique *tableau, int taille_tab, int Tri_entier)
    {
     int i,j;
      for(i = 0; i < taille_tab; i++){	
         printf("%d    ",tableau[i].clef);
         if(Tri_entier == 0){
           for(j = 0; j < tableau[i].taille; j++){
              printf("%d ",tableau[i].donnees[j]);  /* Ici  problème de syntaxe  car le champ données est aussi un tableau */
    	}
         }
       } 
    }
    Ma fonction Copie_elem_generique est fausse mais je ne vois pas ou se trouve le problème.
    Je souhaite entrer au fur et à mesure les éléments de type générique dans le tableau avec les données .
    Cependant le résultat de sortie ne me renvoie que des 0 (le calloc sans doute) à l'affichage.

    Merçi beaucoup de votre aide .

    Cordialement Bil'0x

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Le problème est que tu travailles sur une copie et non le tableau[i] original dans Copie_elem_generique(), il te faudrait utiliser un pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Copie_elem_generique(element, &tableau[i]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    generique Copie_elem_generique(generique S, generique *U) { ... }
    Tel que tu l'as codé, tu pourrais aussi utiliser la valeur retourné retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[i] = Copie_elem_generique(element /*, tableau[i] peu utile de le faire passer dans ce cas*/ );

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Par défaut
    Oui merçi celà fonctionne
    Mais je voudrais savoir si par exemple en faisant :

    tab[i] = element ;
    Je copie tous les champs cle, donnes , taille dans tab[i] ?
    D'après ta dernière ligne de code il semblerait que oui ou bien j'ai mal compris ?

    Merçi

  4. #4
    Invité
    Invité(e)
    Par défaut
    Seules les données statiques sont copiés. Autrement dit, tu ne recopies pas toutes les données du champ int *donnees;, mais seulement leur adresse.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Par défaut
    Ok , je comprends mais alors si je veux écrire une fonction échange correcte comment pourrais-je procéder ?
    J'ai coder un truc mais après plusieurs test les résultats attendus ne collent pas .

    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
     
     
    /* Création d'une variable de type générique */
    generique Creer_elem_generique(int c, int t)
    {
     generique element;
     element.clef = c;
     element.taille = t;
     element.donnees = calloc( t , sizeof(int));
     return element;
    }
     
     
    /* Copie de structures generiques (U <- S) avec copie de leurs données */
    generique *Copie_elem_generique(generique S, generique *U)
    {
     int i=0;
     *U = Creer_elem_generique(S.clef,S.taille);
     for(i=0; i < S.taille; i++){
        (*U).donnees[i] = S.donnees[i];
     }
     return U;          
    }
     
     
    void Echange(generique *tableau,int i,int k)
    {
     generique temp = {0,0,NULL};
     Copie_elem_generique(tableau[i], &temp);        /*temp = tableau[i];*/
     Copie_elem_generique(tableau[k], &tableau[i]);   /*tableau[i] = tableau[k];*/ 
     Copie_elem_generique(temp, &tableau[k]);         /*tableau[k] = temp;  */
    }
    Là encore c'est une histoire de pointeur sur les tableaux je suppose.

    Mais là encore compte tenu de ta remarque précédente le code suivant qui consisterait à copier les éléments de type structure dans un autre tableau de même type ne fonctionnera pas ?
    (les données du champ int *donnees ne seront pas copiés mais uniquement les adresses )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    /* Copie de tableaux contenant des éléments de type structure générique */
    generique *Copie_Tableaux_generique(generique *tableau, int taille_tab)
    { 
      int i;
      generique *TabCopy;
      TabCopy = calloc ( (taille_tab) , sizeof(generique)); 
      for(i=0; i < taille_tab; i++){
          TabCopy = &tableau[i];
          TabCopy++;
      }
      return TabCopy;
    }
    Merçi

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pour effectuer l'échange de deux éléments du tableau, il n'y a pas besoin de ces fonctions de copie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Echange(generique *tableau,int i,int k)
    {
        generique temp;
        temp = tableau[i];
        tableau[i] = tableau[k];
        tableau[k] = temp;
    }
    suffit.
    Tu évites ainsi une copie inutile des valeurs des données en disant juste aux deux pointeurs respectifs d'aller pointer vers les données de l'autre élément du tableau.

Discussions similaires

  1. Question Remplissage Tableau de Structure de données
    Par ImeneBel dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 14/03/2014, 15h49
  2. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 17h28
  3. [LG]Remplissage d'un tableau
    Par luno2545 dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2004, 21h47
  4. Réponses: 13
    Dernier message: 14/10/2003, 14h31
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

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