Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
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 07/01/2013, 20h02   #1
choisima
Invité de passage
 
Homme oussama sama
Étudiant
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme oussama sama
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
Par défaut Problème d'affichage des variables char

Bonsoir.

donc c'est mon tout premier programme en C !! en utilisant les arbres . donc voilà tout marche bien dans mon programme sauf quand j'arrive à afficher une variable Char le programme cesse de fonctionner !! je comprends vraiment pas
Mon programme est trops long et comme j'avait déja dit tout marche bien sauf l'affichage de char voici la fonction que j'utilise

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
 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef  struct noeud *ABR;
typedef struct info
{   int Qte,num;
	char date,Ncl,nom,prenom,Adr;
};
typedef struct noeud 
{ struct info val;
  ABR FD,FG;};
 
void affchcmnd(ABR A)
{
if(arbrevide(A)==0)
{
printf("\n Numéro Commande: %d",A->val.num);
printf("\n Date Commande: %s",A->val.date);
printf("\n Numéro Client: %s",A->val.Ncl);
printf("\n Nom : %s",A->val.nom);
printf("\n Prénom: %s",A->val.prenom);
printf("\n Adresse: %s",A->val.Adr);
printf(" Quantitée Commandée %d \n **** \n",A->val.Qte);
}
};
aidez moi svp
choisima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 20h23   #2
Kirilenko
Membre émérite
 
Avatar de Kirilenko
 
Homme Lucas Pesenti
Étudiant
Inscription : décembre 2011
Messages : 234
Détails du profil
Informations personnelles :
Nom : Homme Lucas Pesenti
Âge : 16
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 234
Points : 858
Points : 858
Envoyer un message via MSN à Kirilenko
Bonsoir,

Il nous manque du code ; je ne suis pas certain qu'on puisse trouver l'erreur sans voir l'initialisation des paramètres qu'on voit dans cette fonction.

Bonne soirée.
__________________
Récursivité en C : épidémie ou hérésie ?

"Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman
Kirilenko est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 20h30   #3
choisima
Invité de passage
 
Homme oussama sama
Étudiant
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme oussama sama
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
voici le code complet
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef  struct noeud *ABR;
typedef struct info
{   int Qte,num;
	char date,Ncl,nom,prenom,Adr;
};
typedef struct noeud 
{ struct info val;
  ABR FD,FG;};
 
int arbrevide(ABR A)
{if (A==NULL)
return 1;
else
return 0;
};
ABR ajouter_cmnd(struct info cmnd,ABR FiD,ABR FiG)
{ABR p=malloc(sizeof(struct noeud));
p->val=cmnd;
p->FD=FiD;
p->FG=FiG;
return p;
};
ABR filsG(ABR A)
{
return (A->FG);
};
ABR filsD(ABR A)
{
	return (A->FD);
};
int feuille(ABR A)
{
 if ((arbrevide(filsG(A))==1) && (arbrevide(filsG(A))==1)) 
	return 1;
 else
    return 0;
};
int Qtecmnd(ABR A)
{
	return (A->val.Qte);
};
int numcmnd(ABR A)
{
	return (A->val.num) ;
};
void newwcmnd(ABR *A,struct info v)
{
if (arbrevide(*A)==1)
*A=ajouter_cmnd(v,NULL,NULL);
else
{
 if (v.Qte<Qtecmnd(*A))
	 newwcmnd(&(*A)->FG,v);
 if (v.Qte>=Qtecmnd(*A))
    newwcmnd(&(*A)->FD,v);
}
};
void traitercmnd(ABR *A,struct info *v)
{
  if(arbrevide(*A)==0)
  {
   if(arbrevide((*A)->FD)==0)
	   traitercmnd(&(*A)->FD,&(*v));
   else
   {
    if(feuille(*A)==1)
	{*v=(*A)->val;
	*A=NULL;}
	else
	{traitercmnd(&(*A)->FG,&(*v));
	 (*A)->val=*v;
	}
   }
  }
};
void affchcmnd(ABR A)
{
if(arbrevide(A)==0)
{
printf("\n Numéro Commande: %d",A->val.num);
printf("\n Date Commande: %s",A->val.date);
printf("\n Numéro Client: %s",A->val.Ncl);
printf("\n Nom : %s",A->val.nom);
printf("\n Prénom: %s",A->val.prenom);
printf("\n Adresse: %s",A->val.Adr);
printf(" Quantitée Commandée %d \n **** \n",A->val.Qte);
}
};
 
void affchGrdQte(ABR A)
{
while (arbrevide(filsD(A))==0)
 A=filsD(A);
affchcmnd(A);
};
 
int nbrcmnd(ABR A)
{
 if(arbrevide(A)==1) 
	 return 0;
 else
     return (1+nbrcmnd(filsD(A))+nbrcmnd(filsG(A)));
};
 
int Qtetotal(ABR A)
{ if (arbrevide(A)==1)
   return 0;
  else
  return(Qtecmnd(A)+Qtetotal(filsG(A))+Qtetotal(filsD(A)));
};
 
void affchlst(ABR A)
{
if (arbrevide(A)==0)
  {affchlst(filsD(A));
   affchcmnd(A);
   affchlst(filsG(A));
  }
};
 
void main()
{int nbr=1,i,cont=0,choix=0;
 ABR A;
 struct info com;
 A=(struct noeud*)malloc(sizeof(struct noeud));
 A=NULL;
 printf("Application GTCom \n Les fonctionalités Diponibles: \n -1- La Saisie des commandes \n -2- Supression des commandes \n -3- La commande contenu la plus grande quantité \n -4- Nombre des Commandes en attente \n -5-  La quantitée commandée totale \n -6- Liste des commandes en attente");
 
 do
 {
  printf("\n Entrer le code de la fonctionalité: ");
  scanf("%d",&choix);
  switch(choix)
  {case 1:printf("\n Combien de commandes vous allez saisir?");
          scanf("%d",&nbr);
          for (i=0;i<nbr;i++)
          {
		  printf("\n Le numéro de cette commande est: ");
          scanf("%d",&com.num);
          printf("\n la date du commande: ");
          scanf("%s",&com.date);
		  printf("\n la le numéro du client: ");
          scanf("%s",&com.Ncl);
		  printf("\n le nom du client: ");
          scanf("%s",&com.nom);
		  printf("\n le prénom du client: ");
          scanf("%s",&com.prenom);
		  printf("\n l'adresse du client: ");
          scanf("%s",&com.Adr);
		  printf("\n La quantité commandée: ");
          scanf("%d",&com.Qte);
          newwcmnd(&A,com);
           }
          printf("\n voulez vous faire d'autre fonctionalité?");
          scanf("%d",&cont);
          break;
   case 2:traitercmnd(&A,&com);
          printf("\n voulez vous faire d'autre fonctionalité?");
          scanf("%d",&cont);
   break;
   case 3:printf("\n la commande contenue la plus grande quantitée: \n");
          affchGrdQte(A);
          printf("\n voulez vous faire d'autre fonctionalité?");
          scanf("%d",&cont);
   break;
   case 4:printf("\n nombre des commandes en attente: %d",nbrcmnd(A));
          printf("\n voulez vous faire d'autre fonctionalité?");
          scanf("%d",&cont);
          break;
   case 6:printf("\n la liste des commandes en attente");
	      affchlst(A);
	      printf("\n voulez vous faire d'autre fonctionalité?");
          scanf("%c",&cont);
	      break;
   case 5:printf("\n La quantitée commandée totale: %d ",Qtetotal(A));
	      printf("\n voulez vous faire d'autre fonctionalité?");
          scanf("%d",&cont);
		  break;
   default:printf("\n Fonctionalité inéxistante");
           printf("\n voulez vous faire d'autre fonctionalité?");
           scanf("%d",&cont);
   }
 }while(cont!=0);
 printf("\n ***END***");
}
choisima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 20h52   #4
Lintel-oo
Membre habitué
 
Homme
Étudiant
Inscription : avril 2011
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 239
Points : 128
Points : 128
C'est au niveau de quelle fonction que ça plante exactement ?

D'ailleurs évite les scanf c'est le genre de chose que tout le monde dit mais c'est vrai que la mémoire corrompue c'est pas top, préfère les méthodes comme fgets() pour la saisie sécurisée (tu peux toujours regarder sur internet si ça t'intéresse).

D'ailleurs tu peux déjà rajouter un break dans le switch au niveau de la case default bien que ça ne résoudra pas ton problème ça t'en enlèveras un qui pourrait survenir
Lintel-oo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h05   #5
choisima
Invité de passage
 
Homme oussama sama
Étudiant
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme oussama sama
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
c'est au niveau de la fonction affchcmnd !! le numéro commande qui est un entier s'affiche mais pas ceux de char
choisima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h05   #6
alakauf
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 71
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 71
Points : 27
Points : 27
tu crées une variable
cela signifie que ta date est codé sur un seul octet. En revanche quand tu l'affiches tu fais un
Donc là tu considères que ta date est une chaine de caractères se terminant par un \0 et que date est un char *.
alakauf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h07   #7
Lintel-oo
Membre habitué
 
Homme
Étudiant
Inscription : avril 2011
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 239
Points : 128
Points : 128
Code :
1
2
A=(struct noeud*)malloc(sizeof(struct noeud));
 A=NULL;
Pourquoi ???? Pourquoi allouer de la mémoire au niveau de A pour ensuite faire pointer A vers une zone "vide" ->> fuite de mémoire tu n'as pas besoin de ces 2 lignes, tu peux immédiatement déclarer
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct info
{   int Qte,num;
	char date,Ncl,nom,prenom,Adr;
};
 
          printf("\n la date du commande: ");
          scanf("%s",&com.date);
		  printf("\n la le numéro du client: ");
          scanf("%s",&com.Ncl);
		  printf("\n le nom du client: ");
          scanf("%s",&com.nom);
		  printf("\n le prénom du client: ");
          scanf("%s",&com.prenom);
		  printf("\n l'adresse du client: ");
          scanf("%s",&com.Adr);
Attention ! Bien que tu ais peut être fait exprès, cela signifie que l'utilisateur ne doit rentrer qu'un seul caractère à chaque demande sinon cela écrase la mémoire dans la structure com et peut aboutir à un comportement totalement bizarre donc c'est pour ça que tu devrais utiliser getchar() ou fgets() pour faire de la saisie sécurisée !

Et d'ailleurs cela rejoint ce que dit alakauf puisque comme tous les attributs de ta structure sont codés par des chars (ou presque) tu dois les afficher en tant que char, ou sinon utiliser des tableaux de chars ou des strings.


Donc tu peux faire
Code :
1
2
3
4
5
6
7
printf("\n Numéro Commande: %d",A->val.num);
printf("\n Date Commande: %c",A->val.date);
printf("\n Numéro Client: %c",A->val.Ncl);
printf("\n Nom : %c",A->val.nom);
printf("\n Prénom: %c",A->val.prenom);
printf("\n Adresse: %c",A->val.Adr);
printf(" Quantitée Commandée %d \n **** \n",A->val.Qte);
Et cela t'obligera à n'avoir qu'un seul caractère pour chaque attribut de ta structure (pas très cool quand meme quelqu'un qui s'appelle A B à l'adresse C à la date D)

Sinon tu changes ta structure en
Code :
1
2
3
4
typedef struct info
{   int Qte,num;
	char* date,Ncl,nom,prenom,Adr;
};
Et tu modifies ton code en conséquences
Lintel-oo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h34   #8
choisima
Invité de passage
 
Homme oussama sama
Étudiant
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme oussama sama
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
Merci pour vos remarques !! c'est bon ça marche avec char*
Merci infiniment !!
choisima 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 19h00.


 
 
 
 
Partenaires

Hébergement Web