Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

reprise de code sur ce forum

6 réponses
Avatar
one t
Bonjour,

J'ai trouv=E9 et modifi=E9 un code d'un forum qui pointe sur une
discussion de ce groupe.
Bref, la version modifi=E9e ne semble pas fonctionner.

Voici ladite version :

void WriteToFile(FILE *FP_FILE)
{
int i ;
char *FNom ;
int FTick ;
char *FNum ;
int ok ;

ok =3D 1 ;
i =3D 0 ;
do
{
printf("\nEntrez le %d%s nom (\"q\" pour quitter) : ", i+1,
(i=3D=3D0)?"er":"eme") ;
UserTxt(FNom) ;
if (FNom[0] !=3D 'q' && i < 4)
{
printf("\nEntrez le numero de ticket : \n") ;
UserTxt(FNum) ;
FTick =3D (int) ConvTxt(FNum) ;
fprintf(FP_FILE, "Prenom : %s\nTicket : %d\n", *FNom, FTick) ;
i++ ;
}
else
ok =3D 0 ;
} while (ok) ;
}

void UserTxt(char *FTxt)
{
int c ;
int i ;
int ok ;

ok =3D 1 ;
do
{
for (i =3D 0 ; ((c =3D getchar()) !=3D '\n') ; i++)
{
if (i < CMAX)
*(FTxt+i) =3D c ;
else
{
printf("\nSaisir moins de 10 caracteres svp : \n") ;
while (getchar() !=3D '\n') ;
ok =3D 0 ;
break ;
}
}
*(FTxt+i) =3D '\0' ;
} while (!ok) ;
}

long ConvTxt(char *FTxt)
{
long ret ;

return ret =3D strtol(FTxt, NULL, 10) ;
}

Message lors de la compilation :
59: warning: format =91%s=92 expects type =91char *=92, but argument 3 has
type =91int=92

Maintenant la version avec des indices de tableau au lieux de
pointeurs fonctionne :

en condens=E9 :

#define CMAX 10
void WriteToFile(FILE *FP_FILE)
{
int i ;
char FNom[CMAX] ;
int FTick ;
char FNum[CMAX] ;
int ok ;
...

6 réponses

Avatar
Lucas Levrel
Le 28 novembre 2010, one t a écrit :

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.



Ma boule de cristal me dit que tu es « bpascal » ou que ladite discussion
était initiée par lui.

Voici ladite version :



Ce code n'est pas complet : pas de main, pas d'include des bibliothèques
kivonbien...

void WriteToFile(FILE *FP_FILE)
{
int i ;
char *FNom ;
int FTick ;
char *FNum ;



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).

(...)
UserTxt(FNom) ;



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...

Message lors de la compilation :
59: warning: format ‘%s’ expects type ‘char *’, but argument 3 has
type ‘int’



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.

Maintenant la version avec des indices de tableau au lieux de
pointeurs fonctionne :
(...)
char FNum[CMAX] ;



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
Avatar
one t
On 29 nov, 10:25, Lucas Levrel wrote:
Le 28 novembre 2010, one t a écrit :

> 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.

Ma boule de cristal me dit que tu es « bpascal » ou que ladite di scussion
était initiée par lui.

> Voici ladite version :

Ce code n'est pas complet : pas de main, pas d'include des bibliothèque s
kivonbien...

> void WriteToFile(FILE *FP_FILE)
> {
>    int i ;
>    char *FNom ;
>    int FTick ;
>    char *FNum ;

Là tu déclares un pointeur. Le prog va réserver de l'espace mémoi re 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 program me
valide).

> (...)
>            UserTxt(FNom) ;

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 s emble,
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 p remière
erreur...

> Message lors de la compilation :
> 59: warning: format ‘%s’ expects type ‘char *’, but argument 3 has
> type ‘int’

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.

> Maintenant la version avec des indices de tableau au lieux de
> pointeurs fonctionne  :
> (...)
>    char FNum[CMAX] ;

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
Avatar
Tonton Th
On 11/29/2010 02:21 PM, one t wrote:

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.



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/
Avatar
Lucas Levrel
Le 29 novembre 2010, one t a écrit :

La ligne 59 correspond à : fprintf(FP_FILE, "Prenom : %snTicket : %d
n", *FNom, FTick) ;



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 ?)

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" ;



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 !

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.



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
Avatar
Tonton Th
On 11/30/2010 11:20 AM, Lucas Levrel wrote:

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 !



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/
Avatar
Erwan David
Lucas Levrel écrivait :

Le 29 novembre 2010, one t a écrit :

La ligne 59 correspond à : fprintf(FP_FILE, "Prenom : %snTicket : %d
n", *FNom, FTick) ;



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 ?)



Oui, dans les fonctions variadiques, les char et les short sont
automatiquement promus en int.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé