Utilisateur anonyme
-
27 mars 2013 à 15:34
Utilisateur anonyme -
27 mars 2013 à 21:16
Hey!
Tout d'abord bonne après-midi :).
Je vous contacte pour vous demander votre aide. En effet je suis le tutoriel destiné à apprendre le langage C qui est posté sur le site du zéro.
Mais j'ai comme dirait quelques problèmes :D. En effet mon code ne compile pas, et je me demande pourquoi ? Les logs du compilateur m'indiquent une erreur au niveau des paramètres de ma fonction contientcaractere(....), mais je ne trouve rien d'anormal.
Voici donc mon code : main.c
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
int main()
{
//CHAR
char key[6] = "MAISON";
char stars[6] = "******";
//INT
int testsLast = 10;
//BOOL
int finded = 0;
while (finded == 0)
{
printf("%s", stars);
printf("%d \n\n", testsLast);
if(contientCaractere(lireCaractere(), &key, &stars) == 0)
testsLast--;
if(stars == key)
{
finded = 1;
printf("\n Bravo vous avez trouvé le mot magique !");
return 1;
}
if(testsLast == 0)
{
printf("Vous avez perdu, vous devez mourir! mouhahahahahaha...");
exit;
}
}
return 0;
}
int contientCaractere(char caractere, char* keytofind, char* starstoshow)
{
int x = 0;
int found = 0;
for (x = 0; x < 6; x++)
{
if (*keytofind[x] == caractere)
{
*starstoshow[x] = caractere;
found = 1;
}
}
return found;
}
char lireCaractere()
{
//CODE DONNNE PAR MATHEO (DANS LE TUTORIEL)
char caractere = 0;
caractere = getchar(); // On lit le premier caractère
caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà
// On lit les autres caractères mémorisés un à un jusqu'au \n (pour les effacer)
while (getchar() != '\n') ;
return caractere; // On retourne le premier caractère qu'on a lu
}
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c||In function 'main':|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c|23|warning: passing argument 2 of 'contientCaractere' from incompatible pointer type [enabled by default]|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.h|5|note: expected 'char *' but argument is of type 'char (*)[6]'|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c|23|warning: passing argument 3 of 'contientCaractere' from incompatible pointer type [enabled by default]|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.h|5|note: expected 'char *' but argument is of type 'char (*)[6]'|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c|36|warning: statement with no effect [-Wunused-value]|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c||In function 'contientCaractere':|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c|49|error: invalid type argument of unary '*' (have 'int')|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c|51|error: invalid type argument of unary '*' (have 'int')|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c||In function 'lireCaractere':|
C:\Users\Corentin\Documents\Projets\0 - Pendu\main.c|63|warning: implicit declaration of function 'toupper' [-Wimplicit-function-declaration]|
|| Build finished: 2 errors, 4 warnings (0 minutes, 0 seconds)|
Merci d'avance!
PS: Je ne vous demande pas de me corriger le code direct ! Juste de m'indiquer mes erreurs, afin que je puisse y remédier :).
PS²: Je n'ai pas posté sur le site du zéro car je ne trouvais pas où créer une discussion dans le forum...
---------------------------------------------------
Je vous regarde !
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 27 mars 2013 à 18:20
Bonjour.
Plusieurs soucis:
char key[6] = "MAISON";
En C, une chaîne de caractères est en fait un tableau de caractères qui finit par '0'.
Donc char key[6] = "MAISON";, peut aussi être écris: char key[6] = {'M', 'A', 'I', 'S', 'O', 'N', 0};
Or tu vois bien qu'il y a 7 cases et non 6 ! Le 0 "terminal" est invisible quand tu l'écris sous forme de chaîne, mais reste bien présent. Tu devrais donc avoir: char key[7] = "MAISON".
char key[6] et char* key, c'est la même chose. Un tableau est un pointeur en C.
Donc quand tu fais: &key, tu lui donnes un "char**" et forcément ça ne lui plaît pas au compilateur, puisque lui veut du "char *". Il faut lui donner "key" et non "&key".
if(stars == key)
Tu ne compares pas les éléments du tableau, mais simplement les addresses de pointeur des débuts de chaque tableau (ça ne sera jamais vrai !)
Pour comparer les éléments contenus dans le tableau un à un, il faut utiliser "strcmp" (ou faire une boucle toi même pour comparer chacune des cases une à une).
exit;
Jamais de "exit" dans ton code ! C'est assez sale. On quitte proprement, quand c'est possible. Un return aurait été plus souhaitable.
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 27 mars 2013 à 21:04
J'étais au courant pour le coup du 0 dans le tableau, mais je croyais que en fait le tableau irait de l'index 0 à 6, donc 7 cases.
Ne ps confondre indice et taille. A la déclaration, ce qu'il y a entre crochet est la taille. Puis à l'utilisation c'est l'indice.
Soit "char tab[7];" veut dire que tu peux aller de "tab[0]" à "tab[6]" (taille de 7).
Cependant voila comment je fais pour comparer les deux tableaux ("boolean" déclarer plus haut) :
On peut améliorer la lisibilité en découpant le code en petite fonction (ce que tu as commencé à faire). On va donc créer une fonction pour cela, pour l'exercice (mais je rappelle que "strcmp" ou "memcmp", font déjà cela).
Tout d'abord, pas besoin de mettre x à 6 (d'ailleurs pourquoi ?). Ensuite, pas besoin parcourir tout le tableau. A la moindre lettre non identique, on peut sortir car on sait que les tableaux ne peuvent pas être identiques.
Ce qui donne:
int isEqual(char* stars, char* keys, int size)
{
int x = 0;
for (x = 0; x < size; ++x)
if (stars[x] != keys[x])
return 0;
return 1;
}
// [...]
if (isEqual(stars, keys, 7))
{
printf("\n Bravo vous avez trouvé le mot magique !");
return 1;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Tout d'abord, pas besoin de mettre x à 6 (d'ailleurs pourquoi ?)
Je l'avais mis pour quitter la boucle for, car vu que j'avais mis...
}else
{
boolean = 1;
}
... (chose inutile d'ailleurs), et que si la dernière lettre correspondait, boolean aurait été mis à 1 alors qu'ils y aurait pu avoir des erreurs.
Mais en effet si j'avais enlever le else et le x = 6 tout aurait été fonctionnel :)...
Merci encore, et bonne soirée.
---------------------------------------------------
Je vous regarde !