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 09/01/2013, 13h43   #1
Fog-Thunder
Invité de passage
 
Homme
Développement Informatique : Première année
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 19

Informations professionnelles :
Activité : Développement Informatique : Première année

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 0
Points : 0
Envoyer un message via MSN à Fog-Thunder
Par défaut Problème > Suppression d'un tableau de structure

Salut à tous, je suis un étudiant en développement informatique.

j'étais en train de coder cet exercice en langage C :

L'exercice :
Citation:
1- Créer une énumération couleur avec la liste suivante :

-Jaune / -Noir
-Rouge /-Blanc
-Bleu

2- Modifier la structure voiture afin d’ajouter le champ couleur v de type couleur ;

3- Écrire un programme qui permet de saisir les données d’une voiture et de les afficher ensuite dans une seule ligne ;

4- Écrire un programme qui permet de remplir un tableau de voitures et de donner la possibilité de modifier et supprimer une voiture selon son matricule ;
Bon, j'ai tout terminé. Le seul problème que j'ai eu consiste en la dernière tâche dans cet exercice : la suppression d'une voiture selon son matricule. Quand j'enregistre plusieurs voitures dans mon pointeur structuré et que j'essaie de supprimer une voiture que j'ai enregistrée, je reçois une erreur et même si je n'entre que 3 voitures et que j'essaye de supprimer la deuxième, les deux chaines de caractères Matricule et Marques ne s'affichent pas :/ ou parfois affichent des caractères bizarre.

Voila Mon code :

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef enum clr {jaune,noir,rouge,blanc,bleu}couleur;
 
typedef struct
{
char *Marque;
char *Matricule;
int nbr_chevaux;
couleur coul;
}voiture ;
 
void viderBuffer()
{
    int c = 0;
 	   while (c != '\n' && c != EOF)
 	   {
     	   c = getchar();
    }
}
 
int main(int argc, char *argv[])
{
  voiture *v; //declaration d'un pointeur structuré - comme un tableau -
  v=calloc(1,sizeof(voiture));
  char *rep=malloc(1);
  int i=0,j,y,R,t;
 
do
{
  R=0;
 
  printf("\t\t\t  ..::-Menu-::..\n\n 1- Ajouter une voiture.\n 2- Supprimer une voiture.\n 3- Modifier les infos d'une voiture.\n 4- Quitter le programme .\n\n Votre Choix -> "); 
  scanf("%d",&R);
  viderBuffer();
 
  switch (R)
  {
   case 1 : 
    { 
 
         (v+i)->Marque=malloc(1);
         (v+i)->Matricule=malloc(1);
 
         printf("\n\nLa Marque de la voiture > ");
         gets((v+i)->Marque);
 
         printf("Le Matricule de la voiture > ");
         gets((v+i)->Matricule);
 
         printf("Le Nombre de chevaux > ");
         scanf("%d",&(v+i)->nbr_chevaux);
 
         printf("La couleur de la voiture : 0-jaune / 1-noir / 2-rouge / 3-blanc / 4-bleu.\n> ");
         scanf("%d",&(v+i)->coul);
         viderBuffer();
         i++;
     }break;
 
  case 2 :
  {
       printf("Entrer le matricule de la voiture que vous voulez supprimer > ");
       gets(rep);
 
       for(j=0;j<i+1;j++)
       {
         if(strcmp(rep,(v+j)->Matricule)==0)
           {
              for(y=j;y<i;y++) // la boucle permet de supprimé la voiture qui a le matricule saisi par l'utulisateur 
                {
                  v[y]=v[y+1]// elle remplace la voiture du matricule choisi par celle qui la suit 
 
                  /*strcpy((v+y)->Marque,(v+y+1)->Marque);  j"ai essayer champs par champs aussi et sa marche pas 
                  strcpy((v+y)->Matricule,(v+y+1)->Matricule);
                  (v+y)->nbr_chevaux=(v+y+1)->nbr_chevaux;
                  (v+y)->coul=(v+y+1)->coul;*/
                }
 
                printf("Voiture supprimer !!\n\n");
                i--;
                break;
            }
        }
 
          free(rep);
       }break;
 
  case 3 :
       {
              viderBuffer();
              printf("Entrer le matricule de la voiture que vous voulez Modifier > "); // modification des infos d'un voiture selon le matricule
              gets(rep);
 
              for(j=0;j<i+1;j++)
              {
                           if(strcmp(rep,(v+j)->Matricule)==0)
                           {
                                              printf(" \n\nChoisissez ce que vous voulez changer : \n1- Marque.\n2- Matricule.\n3- Nombre de chevaux.\n4- Couleur de la voiture.\nChoix > ");
                                              scanf("%d",&t);
                                              viderBuffer();
                                              switch (t)
                                              {
                                                     case 1 : 
                                                     {                                                         
                                                          printf("Marque > ");
                                                          gets((v+j)->Marque);
                                                     }break;
 
                                                     case 2 :
                                                     {
                                                          printf("Matricule > ");
                                                          gets((v+j)->Matricule);
                                                     }break;
 
                                                     case 3 :
                                                     {
                                                           printf("Nombre de chevaux -> ");
                                                           scanf("%d",&(v+j)->nbr_chevaux);
                                                           viderBuffer();
                                                     }break;
 
                                                     case 4 : 
                                                      {
                                                            printf("Couleur de voiture");
                                                            scanf("%d",&(v+j)->coul);
                                                            viderBuffer();
                                                      }break;
 
                                                      default : printf("Invalid Touche\n\n");
                                                 }
                              printf("\n\t\t\tChangement Enregistrer !!\n\n");
                              break;
                        }
          }
    }break; 
 
   case 4 : printf("\n\n\t\t\tA Bientot :) \n\n");break;
 
   default : printf("\t\t\tErreur : \n La valeur que vous venez de saisire n'existe pas dans le menu !!\n\n\n");
}
}
while(R!=4);
 
printf("infos sur les voitures existante : \n"); 
 
for(y=0;y<i+1;y++)
 printf("\nVoiture Numero %d : Marque %s | Couleur %d |Matricule %s | Nbr de chevaux %d \n\n",y+1,(v+y)->Marque,(v+y)->coul,(v+y)->Matricule,(v+y)->nbr_chevaux);
 
  system("PAUSE");	
  return 0;
}
Je cherche à trouver la cause de cette erreur que je reçois et vous pouvez même me donner des remarques sur ce travail avec des infos pour mieux le gérer , Merci d'avance pour votre aide !!
Fog-Thunder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 15h42   #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 622
Points : 12 622
Bonjour,

Code :
v=calloc(1,sizeof(voiture));
Avec ceci tu n'alloues de l'espace que pour une seule voiture. Les appels à (v+i)->... ne sont valides que pour i=0 au delà, tu utilises un espace non réservé.

Similairement, char *rep=malloc(1); va allouer l'espace pour un seul caractère.

Préfère utiliser la fonction fgets() plutôt que gets()
Pourquoi gets est-elle dépréciée en faveur de fgets ?

Pense à libérer la mémoire de toutes les voitures crées à la fin.
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 02h00   #3
Fog-Thunder
Invité de passage
 
Homme
Développement Informatique : Première année
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 19

Informations professionnelles :
Activité : Développement Informatique : Première année

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 0
Points : 0
Envoyer un message via MSN à Fog-Thunder
Merci winjerome , ta réponse était très utile pour moi .

Bon, j'ai réussi à résoudre le problème que j'avais et je pense que c'était a cause de l'allocation
Citation:
v=calloc(1,sizeof(voiture));
qui n'alloue de l'espace que pour une seul voiture, alors j'ai ajouté un realloc avant la fin de l'ajout pour allouer de l'espace à une nouvelle voiture. avant je croyais que les pointeurs peuvent allouer de l'espace automatiquement sans avoir besoin de ré-allouer a chaque fois, ce qui est complètement faux ^^'.

j'ai aussi utiliser fgets a la place de gets et j'ai libérer la mémoire utilisé .

Voila a quoi ressemble mon Code :
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef enum clr {jaune,noir,rouge,blanc,bleu}couleur;
 
typedef struct
{
char *Marque;
char *Matricule;
int nbr_chevaux;
couleur coul;
}voiture ;
 
void viderBuffer()
{
    int c = 0;
 	   while (c != '\n' && c != EOF)
 	   {
     	   c = getchar();
    }
}
 
int main(int argc, char *argv[])
{
  voiture *v=calloc(1,sizeof(voiture)); //declaration d'un pointeur structuré - comme tableau -
  char *rep=malloc(51); 
  int i=0,j,y,R,t;
 
do
{
  R=0;
 
  printf("\t\t\t  ..::-Menu-::..\n\n 1- Ajouter une voiture.\n 2- Supprimer une voiture.\n 3- Modifier les infos d'une voiture.\n 4- afficher les infos des voitures.\n 5- Quitter le programme .\n\n Votre Choix -> "); 
  scanf("%d",&R);
  viderBuffer();
 
  switch (R)
  {
   case 1 : 
    { 
 
         (v+i)->Marque=malloc(51);
         (v+i)->Matricule=malloc(51);
 
         printf("\n\n La Marque de la voiture > ");
         fgets((v+i)->Marque,50,stdin);
         *((v+i)->Marque+(strlen((v+i)->Marque)-1))='\0';// Remplace le '\n' de validation par '\0'
 
 
         printf(" Matricule > ");
         fgets((v+i)->Matricule,50,stdin);
         *((v+i)->Matricule+(strlen((v+i)->Matricule)-1))='\0';// Remplace le '\n' de validation par '\0'
 
         printf(" Nombre de chevaux > ");
         scanf("%d",&(v+i)->nbr_chevaux);
 
         printf(" La couleur :\t0- jaune | 1- noir | 2- rouge | 3- blanc | 4- bleu.\n> ");
         scanf("%d",&(v+i)->coul);
         viderBuffer();
         i++;
         v=realloc(v,sizeof(voiture)*(i+1));
     }break;
 
  case 2 :
  {
       printf("Entrer le Matricule de la voiture a supprimer > ");
       fgets(rep,50,stdin);
       *(rep+(strlen(rep)-1))='\0';
 
       for(j=0;j<i;j++)
       {
         if(strcmp(rep,(v+j)->Matricule)==0)
           {
              for(y=j;y<i;y++) // la boucle permet de supprimé la voiture qui a le matricule saisi par l'utulisateur 
                {
                  v[y]=v[y+1]; // elle remplace la voiture du matricule choisi par celle qui la suit 
                }
 
                printf("\n\t\t\tVoiture supprimer !!\n\n");
                i--;
                system("PAUSE");break;
            }
        }
  }break;
 
  case 3 :
       {
              viderBuffer();
              printf("Entrer le matricule de la voiture que vous voulez Modifier > "); // modification des infos d'un voiture selon le matricule
              fgets(rep,50,stdin);
              *(rep+(strlen(rep)-1))='\0';
 
              for(j=0;j<i;j++)
              {
                           if(strcmp(rep,(v+j)->Matricule)==0)
                           {
                                              printf(" \n\nChoisissez ce que vous voulez changer : \n1- Marque.\n2- Matricule.\n3- Nombre de chevaux.\n4- Couleur de la voiture.\nChoix > ");
                                              scanf("%d",&t);
                                              viderBuffer();
                                              switch (t)
                                              {
                                                     case 1 : 
                                                     {                                                         
                                                          printf("Nouvelle Marque > ");
                                                          fgets((v+j)->Marque,51,stdin);
                                                          *((v+i)->Marque+(strlen((v+i)->Marque)-1))='\0';// Remplace le '\n' de validation par '\0'
                                                          printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                     }break;
 
                                                     case 2 :
                                                     {
                                                          printf("Nouveau Matricule > ");
                                                          fgets((v+j)->Matricule,51,stdin);
                                                          *((v+i)->Matricule+(strlen((v+i)->Matricule)-1))='\0';// Remplace le '\n' de validation par '\0'
                                                          printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                     }break;
 
                                                     case 3 :
                                                     {
                                                           printf("Nombre de chevaux -> ");
                                                           scanf("%d",&(v+j)->nbr_chevaux);
                                                           viderBuffer();
                                                           printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                     }break;
 
                                                     case 4 : 
                                                      {
                                                            printf("Nouvelle Couleur de voiture : \n 0-> jaune | 1-> noir | 2-> rouge | 3-> blanc | 4-> bleu.\n> ");
                                                            scanf("%d",&(v+j)->coul);
                                                            viderBuffer();
                                                            printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                      }break;
 
                                                      default : printf("Invalid Touche\n\n");
                                                 }break;system("PAUSE");                                                         
                        }
          }
    }break; 
 
   case 4 : 
        {
            printf("\n\n\t\t\tInfos sur les voitures existante : \n\n");
 
            for(y=0;y<i;y++) // affichage des infos sur toute les voiture enregistré 
                             printf("\nVoiture Numero %d : Marque %s | Couleur %d |Matricule %s | Nbr de chevaux %d \n",y+1,(v+y)->Marque,(v+y)->coul,(v+y)->Matricule,(v+y)->nbr_chevaux);
          }system("PAUSE");break;
   case 5 : printf("\n\n\t\t\tA Bientôt !! \n\n");break;
 
   default : printf("\t\t\tErreur : \n La valeur que vous venez de saisire n'existe pas dans le menu !!\n\n");
}
printf("\n");
}
while(R!=5);
 
 
// libération de la mémoire 
free(rep);
free(v);
 
  system("PAUSE");	
  return 0;
}
Tu peut aussi ajouter des remarques sur ce code .
Merci d'avance.
Fog-Thunder est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h43.


 
 
 
 
Partenaires

Hébergement Web