reprise de code sur ce forum
Le
one t
Bonjour,
J'ai trouvé et modifié un code d'un forum qui pointe sur une
discussion de ce groupe.
Bref, la version modifiée ne semble pas fonctionner.
Voici ladite version :
void WriteToFile(FILE *FP_FILE)
{
int i ;
char *FNom ;
int FTick ;
char *FNum ;
int ok ;
ok = 1 ;
i = 0 ;
do
{
printf("Entrez le %d%s nom (\"q\" pour quitter) : ", i+1,
(i==0)?"er":"eme") ;
UserTxt(FNom) ;
if (FNom[0] != 'q' && i < 4)
{
printf("Entrez le numero de ticket : ") ;
UserTxt(FNum) ;
FTick = (int) ConvTxt(FNum) ;
fprintf(FP_FILE, "Prenom : %sTicket : %d", *FNom, FTick) ;
i++ ;
}
else
ok = 0 ;
} while (ok) ;
}
void UserTxt(char *FTxt)
{
int c ;
int i ;
int ok ;
ok = 1 ;
do
{
for (i = 0 ; ((c = getchar()) != '') ; i++)
{
if (i < CMAX)
*(FTxt+i) = c ;
else
{
printf("Saisir moins de 10 caracteres svp : ") ;
while (getchar() != '') ;
ok = 0 ;
break ;
}
}
*(FTxt+i) = '\0' ;
} while (!ok) ;
}
long ConvTxt(char *FTxt)
{
long ret ;
return ret = strtol(FTxt, NULL, 10) ;
}
Message lors de la compilation :
59: warning: format %s expects type char *, but argument 3 has
type int
Maintenant la version avec des indices de tableau au lieux de
pointeurs fonctionne :
en condensé :
#define CMAX 10
void WriteToFile(FILE *FP_FILE)
{
int i ;
char FNom[CMAX] ;
int FTick ;
char FNum[CMAX] ;
int ok ;
J'ai trouvé et modifié un code d'un forum qui pointe sur une
discussion de ce groupe.
Bref, la version modifiée ne semble pas fonctionner.
Voici ladite version :
void WriteToFile(FILE *FP_FILE)
{
int i ;
char *FNom ;
int FTick ;
char *FNum ;
int ok ;
ok = 1 ;
i = 0 ;
do
{
printf("Entrez le %d%s nom (\"q\" pour quitter) : ", i+1,
(i==0)?"er":"eme") ;
UserTxt(FNom) ;
if (FNom[0] != 'q' && i < 4)
{
printf("Entrez le numero de ticket : ") ;
UserTxt(FNum) ;
FTick = (int) ConvTxt(FNum) ;
fprintf(FP_FILE, "Prenom : %sTicket : %d", *FNom, FTick) ;
i++ ;
}
else
ok = 0 ;
} while (ok) ;
}
void UserTxt(char *FTxt)
{
int c ;
int i ;
int ok ;
ok = 1 ;
do
{
for (i = 0 ; ((c = getchar()) != '') ; i++)
{
if (i < CMAX)
*(FTxt+i) = c ;
else
{
printf("Saisir moins de 10 caracteres svp : ") ;
while (getchar() != '') ;
ok = 0 ;
break ;
}
}
*(FTxt+i) = '\0' ;
} while (!ok) ;
}
long ConvTxt(char *FTxt)
{
long ret ;
return ret = strtol(FTxt, NULL, 10) ;
}
Message lors de la compilation :
59: warning: format %s expects type char *, but argument 3 has
type int
Maintenant la version avec des indices de tableau au lieux de
pointeurs fonctionne :
en condensé :
#define CMAX 10
void WriteToFile(FILE *FP_FILE)
{
int i ;
char FNom[CMAX] ;
int FTick ;
char FNum[CMAX] ;
int ok ;

Poser une question


Ma boule de cristal me dit que tu es « bpascal » ou que ladite discussion
était initiée par lui.
Ce code n'est pas complet : pas de main, pas d'include des bibliothèques
kivonbien...
Là tu déclares un pointeur. Le prog va réserver de l'espace mémoire pour
stocker ce pointeur et rien d'autre. À ce stade il doit valoir NULL ou
n'importe quoi (je ne sais plus, ça dépend peut-être des options de
compilation, et de toute façon ni l'un ni l'autre ne donnera un programme
valide).
Donc là ton prog va essayer d'écrire soit à l'adresse NULL, soit n'importe
où. Dans tous les cas le résultat n'est pas celui souhaité (il me semble,
car tu n'as pas dit ce que devrait faire le prog).
Il y a sans doute d'autres choses à redire, mais je m'arrête à la première
erreur...
Le message ne nous sert à rien, car n'ayant pas le code exact envoyé au
compilateur, on ne sait notamment pas où est la ligne 59.
Là tu déclares un tableau de chars de taille CMAX. Le prog va donc
réserver de la mémoire pour stocker CMAX chars contigus. Tu pourras y
stocker (par exemple) une chaîne de longueur CMAX-1.
--
LL
Bonjour,
En premier merci pour tes talents de détectives, ce code vient bien
d'une discussion initiée par bpascal mais je ne suis pas la personne
en question.
La ligne 59 correspond à : fprintf(FP_FILE, "Prenom : %snTicket : %d
n", *FNom, FTick) ;
Si je comprends bien, un pointeur peut recevoir une chaîne de
caractère constante au moment et seulement au moment de sa
déclaration : ex. : char *ptrs = "blabla" ;
Par contre, affecter une chaîne de caractères à *ptrs plus loin dans
le programme ne fonctionne pas même si le pointeur pointe vers NULL au
moment de la déclaration ou avant l'affectation de la chaîne de
caractères.
Si je comprends bien à ce stade, il est indispensable à ce stade que
le pointeur pointe vers un tableau style tab[CMAX].
En fait, ce qui pose le plus de difficultés ce sont les pointeurs. Les
posts de bpascal montrent les difficultés que les pointeurs soulèvent.
Merci,
Joseph
char *a = "toto est ivre mort";
char b[] = "toto est ivre mort";
Quand on a compris la différence, tout devient plus clair.
--
Ma coiffeuse est formidable - http://sonia.buvette.org/
OK. Là tu passes *FNom, qui est un char, à fprintf. Or %s attend un
pointeur vers char. Tu dois lui passer FNom. (C'est bizarre que le compilo
parle d'int ; il remplacerait tous les char par des int ?)
Non, comme tu le dis plus loin, un pointeur ne fait que pointer. Il ne
reçoit pas une chaîne de caractères. Vois le message de Tonton Th., où la
difficulté est que la syntaxe des deux lignes est identique mais leur
sémantique est différente !
Attention au signe = avec les chaînes, et n'oublie pas qu'une chaîne est
un tableau de chars et fonctionne donc comme un tableau. Ferais-tu ceci
pour copier un tableau ?
int tab1[10];
int tab2[10]={1,2,3,4,5,6,7,8,9,10};
tab1=tab2;
--
LL
Merci de votre soutien ;)
L'expérience m'a montré que quelqu'un qui a _vrament_ compris
ces deux lignes saura _toujours_ résoudre ses soucis de pointeurs.
Il suffit de conduire l'élève jusqu'au dessin.
--
Ma coiffeuse est formidable - http://sonia.buvette.org/