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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    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 à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    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 à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Oui mais lors de la compilation de mon code j'obtiens un beau segmentation fault à cause de cette foncion échange.
    Meme en faisant sauter la fonction celà ne fonctionne pas.

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 801
    Points : 7 070
    Points
    7 070
    Par défaut
    Comment exécutes-tu cette fonction Echange?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Voici le code permettant son execution

    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
     
     
    void Echange(generique *tableau, int i, int k)
    {
     generique temp = {0,0,NULL};
     temp = tableau[i]; 
     tableau[i] = tableau[k]; 
     tableau[k] = temp;
    }
     
    void Tri_Sel_Ite(generique *tableau, int taille_tab)
    {
      int posmin,i,j;  
      for(i=0; i < taille_tab; i++){	
          posmin = i;  
          for(j=i+1; j < taille_tab; j++ ){
    		  if(tableau[j].clef < tableau[posmin].clef){
                        posmin = j;
                     }
           }
    	Echange(tableau,posmin,i);
      }
    }

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