Aller au menu - Aller au contenu

Ma fonction fonctionne en mode test

Mais ne fonctionne pas dans mon main.c

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne yagami # Posté le 05/07/2009 à 18:11:56
Viser la lune
Avatar

Re-Bonjour;

voila je viens de finir de coder la fonction qui se charge de transformer ****** en M*RR** (pour MARRON) si on lui fourni une chaine qui contient M et R.

Quand je test cette fonction de cette manière:
Code : C
1
afficherMasque( motSecret, "MRA");

Ca me donne : MARR**

Mais quand je fait ça
Code : C
1
2
3
4
5
char *caractersEntrees = NULL;
...
caractersEntrees = lireCaractere();
printf("vous avez entre : %c \n", caractersEntrees);
afficherMasque( motSecret, caractersEntrees);

Le programme plante juste après le printf.

Est ce encore un problème de types ?
La variable "caractersEntrees" a une valeur, puisqu'elle fonctionne bien dans le printf, alors pourquoi pas dans ma fonction ?
Code : C
1
void afficherMasque( char *chaine, char *caracteresEntres);


Merci.


C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 
Hors ligne Al3xx # Posté le 05/07/2009 à 18:13:49

études : IPSA

caractersEntrees est un pointeur sur char, si tu veux avoir accès au caractère sur lequel il pointe, il faut écrire *caractersEntrees.
Hors ligne yagami # Posté le 05/07/2009 à 18:25:58
Viser la lune
Avatar

caractersEntrees est un tableau et si je fait *caractersEntrees ça revient à faire caractersEntrees[0] or moi c'est bien l'adresse du tableau que je veux envoyer pour que les valeurs qu'il contient soient traitées par afficherMasque().

D'ailleurs même si je fais *caractersEntrees ça ne change rien le programme plante toujours après le printf.

EDIT: J'ai reglé le problème en faisant un truc du genre:

Code : C
1
2
3
4
caractersEntrees = lireCaractere();
temp[coups] = caractersEntrees;
printf("vous avez entre : %c \n", temp[coups]);
afficherMasque( motSecret, temp);


Quelqu'un peut me dire pourquoi ça ne fonctionnait pas avant ?

Merci
Édité le 05/07/2009 à 19:01:47 par yagami

C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 
Hors ligne quentin01 # Posté le 05/07/2009 à 19:01:04
Imaginez - Creer - Innover
Avatar

Ville : Cormoranche sur saone
Pays : France métropolitaine

La tu donne une adresse a printf a la place d'une valeur met une * devant caractersEntrees de la fonction printf. Et pis mais y aussi devant celui de ta fonction afficherMasque parceque tu leur envoie des adresses alors qu'ils veulent des valeurs.
Édité le 05/07/2009 à 19:02:17 par quentin01

Image utilisateur
Site encore un peu vide, on recrute ici | Mon portfolio ici design pas très beau ^^
Equipe WingTeam, l'équipe aussi rapide que le vent en formation. :p
Langage que je connais : XHTML | CSS | PHP | SQL | Javascript | C | C++ | Batch
Langage dont je connais les bases : Java | Assembleur et encore d'autre que je ne citerais pas.
 
Hors ligne yagami # Posté le 05/07/2009 à 19:03:53
Viser la lune
Avatar

J'ai réglé le problème voir mon edit plus haut.
Sinon j'aimerai bien une explication si c'est possible.

C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 
Hors ligne quentin01 # Posté le 05/07/2009 à 19:06:58
Imaginez - Creer - Innover
Avatar

Ville : Cormoranche sur saone
Pays : France métropolitaine

Ca ne fonctionnait pas car avant tu lui envoyait un char alors que ta fonction voulais avoir un tableau de char ( enfin je crois ) ^^.

Image utilisateur
Site encore un peu vide, on recrute ici | Mon portfolio ici design pas très beau ^^
Equipe WingTeam, l'équipe aussi rapide que le vent en formation. :p
Langage que je connais : XHTML | CSS | PHP | SQL | Javascript | C | C++ | Batch
Langage dont je connais les bases : Java | Assembleur et encore d'autre que je ne citerais pas.
 
Hors ligne Al3xx # Posté le 05/07/2009 à 19:37:27

études : IPSA

Code : C
1
char *caractersEntrees = NULL;

Je ne vois pas la déclaration d'un tableau ici, mais sache que si tu as un tableau de char, tu as une chaîne de caractères et non pas un caractère seul.
Code : C
1
2
temp[coups] = caractersEntrees;
printf("vous avez entre : %c \n", temp[coups]);

Le 2nd paramètre du printf indique que temp[coups] est de type char, donc caractersEntrees est bien de type char puisque tu affectes cette variable à une case de ton tableau. Ou alors tu utilises des types non compatibles, auquel cas ton compilateur te le ferait remarquer.

PS: je parlais du printf dans mon premier post, pas de l'appel de la fonction ;)
Hors ligne yagami # Posté le 05/07/2009 à 19:57:23
Viser la lune
Avatar

Merci Al3xx pour ces explications.
A force de faire des erreurs et de les corriger on fini par apprendre, comme disent les ricains (trial and error) :D

Maintenant j'ai un autre problème.

D'abords le code:

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
while ( coups != 10)
    {
        printf("Quelle est le mot secret ?");
        caractersEntrees = lireCaractere(); 
        temp[coups] = caractersEntrees; //j'ajoute caractersEntrees à l'entrée n° "coups" du tableau temp
        afficherMasque( motSecret, temp);
        printf("\n\n");
        // Je vérifie avec cette  boucle ce que contient le tableau temp et il n'y a rien à signaler
        printf("temp = (");
        for (i=0; i < coups+1; i++)
        {
            printf("'%c',", temp[i]);
        }
        printf(")\n\n");
        coups++;

    }


Le problème est que mon programme ne fonctionne que pour la première tenatative. Si par exemple j'entre 'M' je reçois M***** mais à la prochaine tenative, quoique je fasse je reçois toujours M*****.
Le tableau temp contient bien les caractères qu'entre l'utilisateur au fur et à mesure qu'il joue.

Par contre si je fait ça (pour tester):

Code : C
1
2
char tableau[4] = {'M', 'R', 'P', 'L'};
afficherMasque( motSecret, tableau);

Et bien ça fonctionne, et ça me renvois M*RR**.

tableau[4] peut contenir ce que temp contiendra après la quatrième tentative du joueur.

Où est l'erreur ?

C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 
Hors ligne Kennylou # Posté le 05/07/2009 à 20:05:28
Avatar

Déjà, pourquoi utiliser un char* pour stocker seulement le caractère retourné par ta fonction lireCaractere() ?
Ensuite, si tu tiens à garder en mémoire tous les caractères entrés par l'utilisateur, autant faire directement temp[coups] = lireCaractere();
Hors ligne yagami # Posté le 05/07/2009 à 20:11:49
Viser la lune
Avatar

En fait mon problème, c'est que je n'ai pas encore pris l'habitude des types.
Au début j'avais besoin d'un char*, car je croyais que j'allais utiliser ce pointeur pour stocker les valeurs entrées par les utilisateurs, mais au fur et à mesure que le code s'élargir, les besoins changes, et j'ai encore du mal à me dire qu'il faut aussi changer le type de la variable quand sa fonction n'est plus la même o_O .

Maintenant j'ai changé caractersEntrees en int.

Merci encore une fois pour ton aide.

Sinon, as tu une idée pour mon nouveau problème, plus haut ?

C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 
Hors ligne Kennylou # Posté le 05/07/2009 à 20:12:32
Avatar

Tu peux montrer tout ton code stp ?
Hors ligne yagami # Posté le 05/07/2009 à 20:16:23
Viser la lune
Avatar

Voici mon main.c :

Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char motSecret[] = "MARRON";
    int  coups = 0, i= 0, caractersEntrees = 0 ;
    char*  temp[10];

    while ( coups != 10)
    {
        printf("Quelle est le mot secret ?");
        caractersEntrees = lireCaractere();
        temp[coups] = caractersEntrees;
        afficherMasque( motSecret, temp);
        printf("\n\n");

        printf("temp = (");
        for (i=0; i < coups+1; i++)
        {
            printf("'%c',", temp[i]);
        }
        printf(")\n\n");
        coups++;

    }
    return 0;
}


Et ma fonction "afficherMasque":

Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void afficherMasque( char *chaine, char *caracteresEntres)
{
    int i= 0, count = 0, y = 0, count1= 0, temp = 0;
    count = strlen(chaine);
    count1 = strlen(caracteresEntres);
    char tableau[count];

    //on rempli le tableau avec les signe (*)
    for (i = 0; i <  count; i++)
    {
        tableau[i] = '*';
    }
    for(i = 0; i < count; i++)
    {
        for(y = 0; y < count1; y++)
        {
            if (caracteresEntres[y] == chaine[i] )
            {
                tableau[i] = caracteresEntres[y];
            }
        }
    }
    for (i = 0; i < count; i++)
    {
        printf("%c",tableau[i]);
    }
}
Édité le 05/07/2009 à 20:18:09 par yagami

C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 
Hors ligne Kennylou # Posté le 05/07/2009 à 20:22:46
Avatar

Alors déjà, pourquoi un tableau de char* ?

Ensuite, fais comme je t'ai dit, fais directement temp[coups] = lireCaractere(); au lieu de passer par une variable intermédiaire.

edit : ouais en fait ton problème était la déclaration de ton tableau de char*. Tu aurais du déclarer simplement un tableau normal. Normalement, ça devrait marcher même s'il y a à redire sur l'algorithme :p
Édité le 05/07/2009 à 20:28:27 par Kennylou
Hors ligne yagami # Posté le 05/07/2009 à 20:29:58
Viser la lune
Avatar

Citation : Kennylou
Alors déjà, pourquoi un tableau de char* ?

Ensuite, fais comme je t'ai dit, fais directement temp[coups] = lireCaractere(); au lieu de passer par une variable intermédiaire.

edit : ouais en fait ton problème était la déclaration de ton tableau de char*. Tu aurais du déclarer simplement un tableau normal.


Où est ce que je dois déclarer un tableau normal ?

Et puis, faire ceci temp[coups] = lireCaractere(); ne régle rien puisque c'est juste une forme simplifiée de ce que je fais.
Édité le 05/07/2009 à 20:31:31 par yagami

C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 
Hors ligne Kennylou # Posté le 05/07/2009 à 20:32:04
Avatar

char temp[10]; au lieu de char* temp[10];

Citation : yagami
Et puis, faire ceci temp[coups] = lireCaractere(); ne régle rien puisque c'est juste une forme simplifiée de ce que je fais.

Bien sûr, mais pourquoi faire compliqué quand on peut faire simple ?
Édité le 05/07/2009 à 20:33:02 par Kennylou
Hors ligne yagami # Posté le 05/07/2009 à 20:43:21
Viser la lune
Avatar

Merci beaucoup. C'était bien ça.
Maintenant ça fonctionne.

Je me rends compte que je confond entre déclarer un tableau et déclarer un pointeur.
Dans ma tête ça revient au même puisque les tableaux sont des pointeurs.
Mais je comprends mieux maintenant.

Merci encore une fois à tous ceux qui m'ont aidé :)

C'est en forgeant qu'on devient forgeron
On progresse en corrigeant ses erreurs, en profitant de l’expérience de tous et en innovant.

Les bons artistes copient, les grands artistes pillent. Steven Paul Jobs
 

Retour au forum "Langage C" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx