Probleme avec les fonctions.
Résolu/Fermé
astengo
Messages postés
8
Date d'inscription
dimanche 24 août 2014
Statut
Membre
Dernière intervention
29 avril 2015
-
Modifié par astengo le 24/08/2014 à 22:12
astengo Messages postés 8 Date d'inscription dimanche 24 août 2014 Statut Membre Dernière intervention 29 avril 2015 - 25 août 2014 à 15:45
astengo Messages postés 8 Date d'inscription dimanche 24 août 2014 Statut Membre Dernière intervention 29 avril 2015 - 25 août 2014 à 15:45
A voir également:
- Probleme avec les fonctions.
- Ces codes secrets vous donnent accès aux fonctions cachées de votre smartphone Android - Accueil - Android
- Codes secrets Android : accéder aux fonctions cachées - Guide
- Les fonctions excel en anglais - Guide
- Comment faire une fonction si avec et ? - Guide
- Mise en forme conditionnelle avec fonction si - Guide
6 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
Modifié par fiddy le 24/08/2014 à 23:10
Modifié par fiddy le 24/08/2014 à 23:10
Plusieurs petites erreurs :
Pour modifier une variable, il faut faire un appel par adresse et non par copie. Donc, il faut plutôt faire dans ton main() :
Du coup, il faut corriger le prototype de la fonction entree() dans le .h
Et dans le .c, il faut modifier aussi.
scanf("%s", joueur.adresse);
Attention, avec scanf("%s", ...); tu ne peux rentrer qu'un mot. Tu peux utiliser sinon scanf("%[^\n]",...). Il ne faut pas oublier non plus de vider le buffer clavier. Ce qui donne quelque chose comme (j'ai enlevé les print() pour plus de visibilité).
Note : je te conseille de remplacer les scanf() par des fgets() qui sont beaucoup plus secure. Si tu veux un programme plus robuste, il faudra également remplacer le getchar() par ta propre fonction de vidage de buffer clavier. Si tu es intéressé je peux te donner un exemple.
Et enfin : n'oublie pas de mettre un petit '\n' dans le printf() final pour forcer l'affichage.
Pour la prochaine fois, merci de poster ton code entre deux balises "code c" pour plus de lisibilité. Exemple :
<"code c">/*ici tu tapes ton code*/<"/code"> (à mettre sans guillemets).
S'il reste des erreurs, n'hésite pas à reposter ton code corrigé.
Cdlt,
Google is your friend
Pour modifier une variable, il faut faire un appel par adresse et non par copie. Donc, il faut plutôt faire dans ton main() :
entree(&joueurs);
Du coup, il faut corriger le prototype de la fonction entree() dans le .h
void entree (Personne *joueur);
Et dans le .c, il faut modifier aussi.
scanf("%s", joueur.adresse);
Attention, avec scanf("%s", ...); tu ne peux rentrer qu'un mot. Tu peux utiliser sinon scanf("%[^\n]",...). Il ne faut pas oublier non plus de vider le buffer clavier. Ce qui donne quelque chose comme (j'ai enlevé les print() pour plus de visibilité).
void entree (Personne *joueur) { scanf("%s", joueur->nom); scanf("%s", joueur->prenom); getchar(); scanf("%[^\n], joueur->adresse); printf("Entrez votre age: "); scanf("%d", &joueur->age); }
Note : je te conseille de remplacer les scanf() par des fgets() qui sont beaucoup plus secure. Si tu veux un programme plus robuste, il faudra également remplacer le getchar() par ta propre fonction de vidage de buffer clavier. Si tu es intéressé je peux te donner un exemple.
Et enfin : n'oublie pas de mettre un petit '\n' dans le printf() final pour forcer l'affichage.
printf("joueurs.nom=%s\n", joueurs.nom);
Pour la prochaine fois, merci de poster ton code entre deux balises "code c" pour plus de lisibilité. Exemple :
<"code c">/*ici tu tapes ton code*/<"/code"> (à mettre sans guillemets).
S'il reste des erreurs, n'hésite pas à reposter ton code corrigé.
Cdlt,
Google is your friend
astengo
Messages postés
8
Date d'inscription
dimanche 24 août 2014
Statut
Membre
Dernière intervention
29 avril 2015
Modifié par astengo le 25/08/2014 à 00:48
Modifié par astengo le 25/08/2014 à 00:48
Merci pour ta rpce rapide!
ah oui le code est en couleur comme ça..
Alors j'ai fait les modifs ds les appels et déclarations de fonctions avec les pointeurs comme tu l'as dit, ds tous les fichiers et tt.
la fonction entree donne ça maintenant:
j'vais rester au scanf pour l'instant, je cherche surtt à me familiariser avec les pointeurs, fonction, appel de fonction.. et tt ça pour l'instant.
avant le programme mettait parfois 2 lignes d'un coup, c'est à dire il demande le nom et aussi tot le prénom sans laisser la possibilité de répondre, c'est parcequ'il manquait les getchar()?
malgré ça le programme ne fonctionne pas, et renvoit pas 0.
ah oui le code est en couleur comme ça..
Alors j'ai fait les modifs ds les appels et déclarations de fonctions avec les pointeurs comme tu l'as dit, ds tous les fichiers et tt.
la fonction entree donne ça maintenant:
void entree (Personne *joueur) { printf("Entrez votre nom: "); scanf("%s", (*joueur).nom); getchar(); printf("Entrez votre prenom: "); scanf("%s", (*joueur).prenom); getchar(); printf("Entrez votre adresse: "); scanf("%s", (*joueur).adresse); getchar(); printf("Entrez votre age: "); scanf("%d", (*joueur).age); getchar(); }
j'vais rester au scanf pour l'instant, je cherche surtt à me familiariser avec les pointeurs, fonction, appel de fonction.. et tt ça pour l'instant.
avant le programme mettait parfois 2 lignes d'un coup, c'est à dire il demande le nom et aussi tot le prénom sans laisser la possibilité de répondre, c'est parcequ'il manquait les getchar()?
malgré ça le programme ne fonctionne pas, et renvoit pas 0.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
25 août 2014 à 00:33
25 août 2014 à 00:33
je comprends pas pourquoi ces fleches à la place des points entre la variable et sa composante?
Les flèches sont un raccourcis pour éviter de rappeler qu'il est question de pointeur dans une structure.
Par exemple : joueur->nom signifie : (*joueur).nom. Après libre à toi d'utiliser (*joueur).nom ou joueur->nom.
quand je laisse les points il refuse de compiler car "request for member..."
Si tu mets le ".", il faut mettre (*joueur).nom. Tu ne peux pas faire joueur.nom puisque joueur est de type pointeur. Et le type pointeur est nécessaire pour modifier le contenu d'une variable.
Ok pour rester sur les scanf. Juste n'oublie pas que si tu restes sur le scanf("%s", ...), tu ne pourras pas saisir de phrase, juste des mots. Donc attention pour la variable "adresse" qui contiendra des espaces.
Ou sinon : scanf("%[^\n]",...) qui signifie "je prends tous les caractères jusqu'à l'obtention de la touche entrée". Donc y compris les espaces.
Pour le buffer clavier, il est indispensable si tu utilises scanf("%s[^\n"]", ...). Sinon, le programme ne te laissera pas saisir de mot pour cette ligne. Si tu utilises scanf("%s",...) ou scanf("%d", ...) tu n'as pas besoin de le vider.
Les flèches sont un raccourcis pour éviter de rappeler qu'il est question de pointeur dans une structure.
Par exemple : joueur->nom signifie : (*joueur).nom. Après libre à toi d'utiliser (*joueur).nom ou joueur->nom.
quand je laisse les points il refuse de compiler car "request for member..."
Si tu mets le ".", il faut mettre (*joueur).nom. Tu ne peux pas faire joueur.nom puisque joueur est de type pointeur. Et le type pointeur est nécessaire pour modifier le contenu d'une variable.
Ok pour rester sur les scanf. Juste n'oublie pas que si tu restes sur le scanf("%s", ...), tu ne pourras pas saisir de phrase, juste des mots. Donc attention pour la variable "adresse" qui contiendra des espaces.
Ou sinon : scanf("%[^\n]",...) qui signifie "je prends tous les caractères jusqu'à l'obtention de la touche entrée". Donc y compris les espaces.
Pour le buffer clavier, il est indispensable si tu utilises scanf("%s[^\n"]", ...). Sinon, le programme ne te laissera pas saisir de mot pour cette ligne. Si tu utilises scanf("%s",...) ou scanf("%d", ...) tu n'as pas besoin de le vider.
astengo
Messages postés
8
Date d'inscription
dimanche 24 août 2014
Statut
Membre
Dernière intervention
29 avril 2015
25 août 2014 à 15:37
25 août 2014 à 15:37
Ok, j'vais rester au scanf "tt simple" du coup..
Ces histoires de pointeurs sont encore un peu floues.. donc j'ai fait le programme bcp plus simple, pour bien utiliser seulment les structures. J'ai viré adresse et tout du type structure pour n'avoir qu'un mot a rentrer a chaque fois.
Voila ce qu'il donne:
Malgré ça l'exe n'affiche pas les 3 printf finaux, il ne renvoit meme pas 0.. Il doit s'arreter au dernier scanf ?
Sais tu pourquoi?
Ces histoires de pointeurs sont encore un peu floues.. donc j'ai fait le programme bcp plus simple, pour bien utiliser seulment les structures. J'ai viré adresse et tout du type structure pour n'avoir qu'un mot a rentrer a chaque fois.
Voila ce qu'il donne:
#include <stdio.h> #include <stdlib.h> typedef struct Personne Personne; struct Personne { char nom[100]; char prenom[100]; int age; }; int main() { Personne joueurs= {"", "", 0}; printf("Entrez votre nom: "); scanf("%s", joueurs.nom); printf("Entrez votre prenom: "); scanf("%s", joueurs.prenom); printf("Entrez votre age: "); scanf("%d", joueurs.age); printf("%s\n", joueurs.nom); printf("%s\n", joueurs.prenom); printf("%d\n", joueurs.age); return 0; }
Malgré ça l'exe n'affiche pas les 3 printf finaux, il ne renvoit meme pas 0.. Il doit s'arreter au dernier scanf ?
Sais tu pourquoi?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
evilfalcon
Messages postés
58
Date d'inscription
samedi 15 décembre 2012
Statut
Membre
Dernière intervention
10 novembre 2015
Modifié par evilfalcon le 25/08/2014 à 15:44
Modifié par evilfalcon le 25/08/2014 à 15:44
il ne manque pas les & sur scanf?
si je en me trompe pas, nous devons écrire:
tu enregistres sur une adresse?
si je en me trompe pas, nous devons écrire:
scanf("%d",& notre_variable);
tu enregistres sur une adresse?
astengo
Messages postés
8
Date d'inscription
dimanche 24 août 2014
Statut
Membre
Dernière intervention
29 avril 2015
25 août 2014 à 15:45
25 août 2014 à 15:45
putin oui! mtn ça marche.
merci.
merci.