Programmation en C
Résolu/Fermé
shareaza15
Messages postés
667
Date d'inscription
samedi 16 mai 2009
Statut
Membre
Dernière intervention
11 mai 2010
-
29 juil. 2009 à 18:19
mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 - 30 juil. 2009 à 15:11
mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 - 30 juil. 2009 à 15:11
A voir également:
- Programmation en C
- Application de programmation - Guide
- Mettre en veille un programme - Guide
- Programmation logo tortue télécharger - Télécharger - Études & Formations
- Top44rbn programmation - Forum Programmation
6 réponses
mamiemando
Messages postés
33636
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2025
7 842
30 juil. 2009 à 00:20
30 juil. 2009 à 00:20
Désolée mais tu as dû te tromper :
Je pense que l'information qui te manque et qui te bloque c'est la notion d'horizon en C (un horizon est une paire d'accolade et son contenu direct, et quand je dis paire d'accolades, je parle des accolades d'une fonction, d'un bloc if, d'une boucle for ou while etc...). Le nom d'une variable n'est pas globale si celle-ci n'est pas déclarée comme telle (c'est-à-dire si elle est déclarée dans le prototype ou dans le corps d'une fonction).
De plus tout paramètre manipulé par une fonction est toujours une recopie du paramètre qui a été passé à cette fonction. Ainsi le fait de modifier une variable passée en paramètre d'une fonction ne la modifie qu'à l'intérieur de cette fonction.
Pour qu'une fonction g puisse modifier une variable x déclarée déclarée dans une fonction f, il faut passer à g une référence ou l'adresse (pointeur) de x. Par exemple :
J'insiste sur le fait que le nom que tu choisis pour tes paramètres de fonction n'a aucun impact en dehors de cette fonction, il n'a une signification que dans la fonction. Ainsi tu peux tout à fait écrire :
... bien qu'incrémenter2 ait un prototype ou la variable passée en paramètre s'appelle x.
Afin que tu comprennes ce qui se passe j'ai repris ton code et je l'ai déroulé. Les instructions sont exécutées dans l'ordre indiqué : 1), 2), 3) etc... Le programme débute dans le main (étape 1).
#include <stdio.h> int kjhb(int resultat2){ return resultat2 * 3; } int main(){ int nombreentre; printf("Entrez un nombre...\n"); scanf("%d", &nombreentre); printf("Le triple du nombre est %d\n", kjhb(nombreentre)); return 0; }
Je pense que l'information qui te manque et qui te bloque c'est la notion d'horizon en C (un horizon est une paire d'accolade et son contenu direct, et quand je dis paire d'accolades, je parle des accolades d'une fonction, d'un bloc if, d'une boucle for ou while etc...). Le nom d'une variable n'est pas globale si celle-ci n'est pas déclarée comme telle (c'est-à-dire si elle est déclarée dans le prototype ou dans le corps d'une fonction).
{ // début horizon1 int x; { // début horizon2 int y; // x et y ont un sens car on est dans les horizons 1 et 2 } // fin horizon2 // y n'a pas de sens car cette variable est défini dans l'horizon 2 } // fin horizon1 { // horizon3 int z; // x et y ne sont pas définis dans cet horizon } // fin horizon3
De plus tout paramètre manipulé par une fonction est toujours une recopie du paramètre qui a été passé à cette fonction. Ainsi le fait de modifier une variable passée en paramètre d'une fonction ne la modifie qu'à l'intérieur de cette fonction.
Pour qu'une fonction g puisse modifier une variable x déclarée déclarée dans une fonction f, il faut passer à g une référence ou l'adresse (pointeur) de x. Par exemple :
void incrementer1(int x){ // C ou C++. Passe par valeur (recopie) ++x; // La recopie de x manipulée par incrementer1 // vaut 70... mais x vaut toujours 69 dans main } void incrementer2(int *x){ // C ou C++. Passage par pointeur ++(*x); // ici ça marche car le paramètre recopié est l'adresse // de la variable x déclarée dans main. // on modifie bien x ! } void incrementer3(int & x){ // spécifique au C++. Passage par référence ++y; // passage par référece } int main(){ int x = 69; incrementer1(x); // 69 ! incrementer2(&x); // 70 incrementer3(x); // 71 }
J'insiste sur le fait que le nom que tu choisis pour tes paramètres de fonction n'a aucun impact en dehors de cette fonction, il n'a une signification que dans la fonction. Ainsi tu peux tout à fait écrire :
int x = 69; int y = 20; incrementer2(&x); // x = 70 incrementer2(&y); // y = 20
... bien qu'incrémenter2 ait un prototype ou la variable passée en paramètre s'appelle x.
Afin que tu comprennes ce qui se passe j'ai repris ton code et je l'ai déroulé. Les instructions sont exécutées dans l'ordre indiqué : 1), 2), 3) etc... Le programme débute dans le main (étape 1).
#include <stdio.h> #include <stdlib.h> int kjhb(int resultat2) // Étape 7. Cette variable est recopie de la variable // resultat2 de kjhg et vaut 4812442 { resultat2 * 3; // 8) Il ne se passe rien... tu fais un calcul // que tu ne stockes pas, résultat2 n'est pas modifié return resultat2; // 9) On retourne 4812442 et on va à l'étape 10 } int kjhg(int nombreentre) // Étape 3. Cette variable est une recopie // de la variable nombreentre de la fonction main. Cette dernière // ne sera donc pas modifiée par khhg bien que les deux variables // aient le même nom, car ce n'est plus le même horizon. { int resultat2; // 4) Cet entier n'est pas initialisé et vaut par exemple 4812442 nombreentre = resultat2; // 5) nombreentre vaut désormais 4812442 nombreentre = kjhb(resultat2); // 6) On va à l'étape 7. 10) nombreentre vaut 4812442 return nombreentre; // 11) on retourne 4812442 } int main(int argc, char *argv[]) // Étape 1) Le programme commence ici { int nombreentre; printf("Entrez un nombre..."); scanf("%d", &nombreentre); // 2) L'utilisateur rentre une valeur (par exemple 3) printf("Le triple du nombre est %d", kjhg(nombreentre)); // On va à l'étape 3). // 12) On a donc écrit 4812442 ! return 0; }
happy_girl
Messages postés
111
Date d'inscription
vendredi 7 novembre 2008
Statut
Membre
Dernière intervention
26 juillet 2012
1
29 juil. 2009 à 18:22
29 juil. 2009 à 18:22
bn je tiens a te rappller que la 1ere fonction va toujours retourner l'entier que tu tape comme parametre et elle vas plus donner le resultat de la multiplication sauf si tu met :
int kjhb(int resultat2)
{
resultat2 = resultat2 * 3;
return resultat2;
}
int kjhb(int resultat2)
{
resultat2 = resultat2 * 3;
return resultat2;
}
mamiemando
Messages postés
33636
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2025
7 842
29 juil. 2009 à 18:32
29 juil. 2009 à 18:32
Ou mieux :
Ou encore mieux :
Bonne chance
int kjhb(int resultat2){ resultat2 *= 3; return resultat2; }
Ou encore mieux :
int kjhb(int resultat2){ return resultat2*3; }
Bonne chance
shareaza15
Messages postés
667
Date d'inscription
samedi 16 mai 2009
Statut
Membre
Dernière intervention
11 mai 2010
26
29 juil. 2009 à 23:15
29 juil. 2009 à 23:15
Desolé Sa ne marche pas
avez vous d'autres proposition??
MERCI
avez vous d'autres proposition??
MERCI
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
shareaza15
Messages postés
667
Date d'inscription
samedi 16 mai 2009
Statut
Membre
Dernière intervention
11 mai 2010
26
30 juil. 2009 à 12:17
30 juil. 2009 à 12:17
Merci Beaucoup!!!!
mamiemando
Messages postés
33636
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2025
7 842
30 juil. 2009 à 15:11
30 juil. 2009 à 15:11
De rien, bonne continuation !