PENDU - Aides requises (débutant)

Résolu
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
}


main.h
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

char lireCaractere();
int contientCaractere(char caractere, char* key, char* stars);

#endif // MAIN_H_INCLUDED


Messages de build :
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 !

5 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
Utilisateur anonyme
27 mars 2013 à 20:28
Bonsoir et merci pour ta correction,

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.

Ok je vais faire comme tu m'as indiqué pour la comparaison entre les deux tableaux.

Ok pour le "exit" je n'oublierais pas :).

Merci,
Sorpia.
---------------------------------------------------
Je vous regarde !
0
Utilisateur anonyme
27 mars 2013 à 20:50
Re-bonsoir et merci pour tout, mon petit pendu fonctionne à merveille.

Cependant voila comment je fais pour comparer les deux tableaux ("boolean" déclarer plus haut) :

int x = 0;
        for(x = 0; x < 6; x++)
        {
            if(stars[x] != key[x])
            {
                boolean = 0;
                x = 6;
            }else
            {
                boolean = 1;
            }
        }

        if(boolean == 1)
        {
            printf("\n Bravo vous avez trouvé le mot magique !");
            return 1;
        }


N'y aurais t'il pas un moyens de l'optimiser un peu :) ?


---------------------------------------------------
Je vous regarde !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
27 mars 2013 à 21:16
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 !
0
Rejoignez-nous