OVH Cloud OVH Cloud

[C] pb avec streql()

2 réponses
Avatar
The chosen one
Bonjour,

J'ai un pb depuis plusieurs jours avec la fonction streql, Borland me
retourne toujours le message :
"Cannot convert 'int' to 'char *'
Type mismatch in parameter 'chaine 1' in call to 'streql(char *, char *)' "

voilà la source de la fonction streql :

int streql(char *chaine1, char *chaine2)
{
while ((*chaine1 == *chaine2) && (*chaine1))
{
chaine1++;
chaine2++;
}
return((*chaine1 == NULL) && (*chaine2 == NULL));
}


et celle de mon programme :


void questionnement(question, reponse)
{
char lettre;
printf("%s\n", question);
lettre=getch();
lettre=toupper(lettre);
if (streql(lettre, reponse)) // apparement l'erreur est là selon
Borland
{
printf("Correct");
}
else
{
printf("Faux !");
}
}


void main(void)
{
char Q1[]="Question numero 1"; //la question
char R='A'; //la réponse
}



Merci à quiconque me m'aidera à trouver l'erreur !

2 réponses

Avatar
Emmanuel Delahaye
In 'fr.comp.os.ms-windows.programmation', "The chosen one"
wrote:

Bonjour,

J'ai un pb depuis plusieurs jours avec la fonction streql, Borland me
retourne toujours le message :
"Cannot convert 'int' to 'char *'
Type mismatch in parameter 'chaine 1' in call to 'streql(char *, char *)' "

voilà la source de la fonction streql :

int streql(char *chaine1, char *chaine2)



Donc elle attend deux pointeurs sur chaine.

T'es sûr que c'est pas plutôt:

int streql(char const *chaine1, char const *chaine2)

{
while ((*chaine1 == *chaine2) && (*chaine1))
{
chaine1++;
chaine2++;
}
return((*chaine1 == NULL) && (*chaine2 == NULL));



return *chaine1 == 0 && *chaine2 == 0;

}



Qu'est-ce qui ne va pas avec strcmp() (qui est standard).

et celle de mon programme :


void questionnement(question, reponse)
{
char lettre;
printf("%sn", question);
lettre=getch();
lettre=toupper(lettre);
if (streql(lettre, reponse)) // apparement l'erreur est là selon
Borland




Ben oui. Visiblement, tu ne sais pas faire la différence entre un 'char' et
un 'char*'. La fonction attend l'adresse d'une chaine de caractères. Il faut
donc lui en fournir une valide :

{
char s[2];

s[0] = lettre;
s[1] = 0;

if (streql(s, reponse))


{
printf("Correct");
}
else
{
printf("Faux !");
}
}


void main(void)



int main(void)

{
char Q1[]="Question numero 1"; //la question
char R='A'; //la réponse



return 0;

Si il n'y a que çà dans le main(), tu n'iras pas loin!

}



Je te conseille de lire la FAQ de news:fr.comp.lang.c :

FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
Avatar
Ambassadeur Kosh
#include <assert>

bool streql(const char *chaine1, const char *chaine2)
{
assert(chaine1!=NULL) ;
assert(chaine2!=NULL) ;

while((*chaine1 == *chaine2) && (*chaine1!='x0'))
{
chaine1++;
chaine2++;
}

return (*chaine1 == 'x0') && (*chaine2 == 'x0') ;
}

0) visiblement, vous estimez que chaine1 et chaine2 se referent toujours à
une zone de données. specifiez le.
1) vous renvoyez qqchose qui est la valeur d'un prédicat. pourquoi renvoyer
un int ? renvoyez un bool !
2) evitez les écritures incompletes : *chaine1!='x0' est bien plus
compréhensible que *chaine1
3) employez les bons types. une chaine de caracteres contient des
caracteres, pas des void*
4) chaine1 et chaine2 ne doivent pas être modifiées par streql. utilisez
const. c'est une garantie pour la fonction, et pour l'utilisateur de celle
ci.

void questionnement(const char *question, const char *reponse)
{
printf("%sn", question) ;

const int lettre = getch() ;

if(lettre>=0 && lettre<256)
{
// mettre une lettre en maj n'a pas de sens sinon
const int lettre_maj = toupper(lettre) ;

char chaine[2]="?" ;

chaine[0] = (char)lettre_maj ;

if (streql(chaine, reponse))
{
...

}
else
{
// getch renvoie n'imp
}
}

4) d'apres ce que je comprend de streql, vous supposez que les char * passés
représentent des chaines C, cad une suite de caracteres terminée par un
caractere 0. donc essayez de vous tenir à cette convention.
5) testez vos données. getch renvoie un int. il n'est pas dit qu'un int soit
toujours compris entre 0 et 255
6) evitez les prototypage à la c..., cad tout déclarer en haut. preferer ne
declarer que dans la portée ou la variable à une valeur valide. exemple,
toupper n'a pas de sens si lettre n'est pas une valeur entre 0 et 255. alors
ca n'est pas la peine de lui en donner un avec une valeur de "non sens",
autant se servir de la portée pour garantir la cohérence.
7) évitez les affectations. faites plusieurs variables. c'est fini les zx80,
la pile et l'optim de code font des merveilles. privilegiez plutôt l'aspect
logique.
8) faites du C++. laissez tomber le C.

void main()
{
const char *Q1="Question numero 1"; //la question
const char *R="A" ; //la réponse
}

conclusion : c'est pas gagné hein :)

note perso : Arnaud, je pense que cet exemple illustre clairement mes propos
et apporte de l'eau à mon moulin. je ne connais personne qui aurait pu en
écrire autant en C#.