Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/01/2013, 20h39   #1
Bil'0x
Invité régulier
 
Inscription : juillet 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 19
Points : 6
Points : 6
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 :
1
2
3
4
5
struct model {
  int indice;
  int taille;
  int *donnees;
};
Voilà les fonctions associées
Fonctions.c

Code :
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
Bil'0x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 21h03   #2
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 617
Points : 12 617
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 :
Copie_elem_generique(element, &tableau[i]);
Code :
generique Copie_elem_generique(generique S, generique *U) { ... }
Tel que tu l'as codé, tu pourrais aussi utiliser la valeur retourné retour :
Code :
tableau[i] = Copie_elem_generique(element /*, tableau[i] peu utile de le faire passer dans ce cas*/ );
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h25   #3
Bil'0x
Invité régulier
 
Inscription : juillet 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 19
Points : 6
Points : 6
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
Bil'0x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h31   #4
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 617
Points : 12 617
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.
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 20h11   #5
Bil'0x
Invité régulier
 
Inscription : juillet 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 19
Points : 6
Points : 6
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 :
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 :
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
Bil'0x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 21h29   #6
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 617
Points : 12 617
Pour effectuer l'échange de deux éléments du tableau, il n'y a pas besoin de ces fonctions de copie
Code :
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.
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 14h03   #7
Bil'0x
Invité régulier
 
Inscription : juillet 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 19
Points : 6
Points : 6
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.
Bil'0x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 14h40   #8
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 321
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 321
Points : 1 819
Points : 1 819
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)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 14h54   #9
Bil'0x
Invité régulier
 
Inscription : juillet 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 19
Points : 6
Points : 6
Voici le code permettant son execution

Code :
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);
  }
}
Bil'0x est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h26.


 
 
 
 
Partenaires

Hébergement Web