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 *)' "
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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)
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 :
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/
In 'fr.comp.os.ms-windows.programmation', "The chosen one"
<forcechosen@hotmail.com> 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)
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 :
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)
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 :
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.
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.
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#.
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.
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.
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#.
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.
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.
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#.