[C] Question générale sur un prog en C ...
Fermé
oliver91
Messages postés
51
Date d'inscription
lundi 21 mai 2007
Statut
Membre
Dernière intervention
9 septembre 2009
-
22 mai 2007 à 16:52
oliver91 Messages postés 51 Date d'inscription lundi 21 mai 2007 Statut Membre Dernière intervention 9 septembre 2009 - 22 mai 2007 à 23:57
oliver91 Messages postés 51 Date d'inscription lundi 21 mai 2007 Statut Membre Dernière intervention 9 septembre 2009 - 22 mai 2007 à 23:57
A voir également:
- [C] Question générale sur un prog en C ...
- Direction générale de la concurrence, de la consommation et de la répression des fraudes - Accueil - Arnaque
- Robot prog - Télécharger - Édition & Programmation
- Comment calculer une moyenne générale sur 20 - Guide
- Que faire après une seconde générale ratée ✓ - Forum Études / Formation High-Tech
- Ping défaillance générale - Forum Matériel & Système
9 réponses
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
22 mai 2007 à 17:47
22 mai 2007 à 17:47
Bonjour,
La question que tu pose est celle de la zone d'existance d'une variable.
Une variable existe là ou tu la crée.
Si tu créé une variable dans une fonction, tu pourra y faire ce que tu veux avec tant que tu reste dans le corps de cette fonction (enfin dans le bloc ou tu as déclarer cette variable. Ex : dans un bloc while).
Mais si tu fais appel par la suite à cette variable dans une autre fonction ou un main et qu'une variable du même nom n'a pas été déclarée dans le bloc ou tu y fais appel, tu auras une erreur à la compilation comme quoi ta variable est inconnue. Suite à cela, si tu pense simplement devoir déclarer une variable du même nom pour pouvoir utiliser la variable déclarée dans une fonction précédente, cela ne fonctionnera pas, ou du moins avec une valeur différente. En effet, dans un bloc, c'est toujours la variable la moins "globale" qui prends le dessus et qui est manipulée par ton programme, à moins que tu spécifie. C'est d'ailleur pour cela qu'il faut toujours bien nommer ses variables afin de ne jamais avoir deux variables de même nom ! (Mise à part les compteur de boucle, et encore...).
Donc pour qu'une variable définie dans une autre soit prise en compte, il faut que tu passe cette variable en paramètre de fonction en fonction. Autre solution : les variables globales, qui sont définies en dehors de tout (généralement au début du fichier .c ou dans un fichier .h de définition). Les variables globales sont a utilisée dans le cadre de variables clés (par exemple les points de vies d'un personnage dans une classes Personnage), et c'est à manipulée avec précaution (attention à l'accès multiple si ces variables globales sont manipulées par plusieurs processus...).
Pour utiliser une variable dans une fonction et pouvoir récupérer cette dernière suite à un modification au sein de cette fonction depuis la fonction appellante, il faut utiliser les * (dans l'entete de la fonction qui modifie la valeur) et le & lors du passage en paramètre de la variable.
Bref, pour ce qui est d'information générale, succeptible d'être utilisée par plusieurs fonctions il est utile de les définir dans le niveau le plus haut, c'est à dire si deux fonctions utilisent cette variables (modification et affichage dans ton cas) et que ces deux fonctions sont appelées depuis une troisième (ici ton main), le mieux est de déclarer ta variable dans le main et de la passer en paramètre à chacune des deux fonctions (dont l'une devra avoir & afin de récupérer la nouvelle valeur de la variable et l'afficher correctement dans l'autre fonction).
Pour tester ce principe, test une première fois sans le '&' lors de l'appel à la fonction de modification, puis avec le '&'. La première fois ta valeur ne devrait pas apparaitre comme modifiée et la seconde si.
Bon courage pour la suite.
La question que tu pose est celle de la zone d'existance d'une variable.
Une variable existe là ou tu la crée.
Si tu créé une variable dans une fonction, tu pourra y faire ce que tu veux avec tant que tu reste dans le corps de cette fonction (enfin dans le bloc ou tu as déclarer cette variable. Ex : dans un bloc while).
Mais si tu fais appel par la suite à cette variable dans une autre fonction ou un main et qu'une variable du même nom n'a pas été déclarée dans le bloc ou tu y fais appel, tu auras une erreur à la compilation comme quoi ta variable est inconnue. Suite à cela, si tu pense simplement devoir déclarer une variable du même nom pour pouvoir utiliser la variable déclarée dans une fonction précédente, cela ne fonctionnera pas, ou du moins avec une valeur différente. En effet, dans un bloc, c'est toujours la variable la moins "globale" qui prends le dessus et qui est manipulée par ton programme, à moins que tu spécifie. C'est d'ailleur pour cela qu'il faut toujours bien nommer ses variables afin de ne jamais avoir deux variables de même nom ! (Mise à part les compteur de boucle, et encore...).
Donc pour qu'une variable définie dans une autre soit prise en compte, il faut que tu passe cette variable en paramètre de fonction en fonction. Autre solution : les variables globales, qui sont définies en dehors de tout (généralement au début du fichier .c ou dans un fichier .h de définition). Les variables globales sont a utilisée dans le cadre de variables clés (par exemple les points de vies d'un personnage dans une classes Personnage), et c'est à manipulée avec précaution (attention à l'accès multiple si ces variables globales sont manipulées par plusieurs processus...).
Pour utiliser une variable dans une fonction et pouvoir récupérer cette dernière suite à un modification au sein de cette fonction depuis la fonction appellante, il faut utiliser les * (dans l'entete de la fonction qui modifie la valeur) et le & lors du passage en paramètre de la variable.
Bref, pour ce qui est d'information générale, succeptible d'être utilisée par plusieurs fonctions il est utile de les définir dans le niveau le plus haut, c'est à dire si deux fonctions utilisent cette variables (modification et affichage dans ton cas) et que ces deux fonctions sont appelées depuis une troisième (ici ton main), le mieux est de déclarer ta variable dans le main et de la passer en paramètre à chacune des deux fonctions (dont l'une devra avoir & afin de récupérer la nouvelle valeur de la variable et l'afficher correctement dans l'autre fonction).
Pour tester ce principe, test une première fois sans le '&' lors de l'appel à la fonction de modification, puis avec le '&'. La première fois ta valeur ne devrait pas apparaitre comme modifiée et la seconde si.
Bon courage pour la suite.
oliver91
Messages postés
51
Date d'inscription
lundi 21 mai 2007
Statut
Membre
Dernière intervention
9 septembre 2009
3
22 mai 2007 à 18:06
22 mai 2007 à 18:06
Merci beaucoup.
tristesobre
Messages postés
113
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
21 juin 2009
60
22 mai 2007 à 18:12
22 mai 2007 à 18:12
Question sur la portée des variables (kij_82 fait également, et très justement, reférence à la "Zone d'existence des variables", ce qui revient sensiblement au même ).
Ce questionnement complexe peut se reformuler comme suit :
Quand je déclare une variable quelque part dans mon code, cette variable est elle accessible partout dans mon code, et si ce n'est pas le cas, quelles sont les règles qui régentent la portée des variables ?
Pour répondre à cette question fort complèxe je te recommande quelques lectures :
c.f. : -- cppvar --
Plus complet : http://www.idris.fr/data/cours/lang/c/
Surtout je te recommande la lecture des livres. Sache que c'est une question que tous les programmeurs se posent et se reposent des milliers de fois aux cours de l'écriture d'un programme. Si tu comptes programmer, il est nécessaire d'approfondir la question.
Cordialement,
Tristesobre.
Ce questionnement complexe peut se reformuler comme suit :
Quand je déclare une variable quelque part dans mon code, cette variable est elle accessible partout dans mon code, et si ce n'est pas le cas, quelles sont les règles qui régentent la portée des variables ?
Pour répondre à cette question fort complèxe je te recommande quelques lectures :
c.f. : -- cppvar --
Plus complet : http://www.idris.fr/data/cours/lang/c/
Surtout je te recommande la lecture des livres. Sache que c'est une question que tous les programmeurs se posent et se reposent des milliers de fois aux cours de l'écriture d'un programme. Si tu comptes programmer, il est nécessaire d'approfondir la question.
Cordialement,
Tristesobre.
oliver91
Messages postés
51
Date d'inscription
lundi 21 mai 2007
Statut
Membre
Dernière intervention
9 septembre 2009
3
22 mai 2007 à 18:16
22 mai 2007 à 18:16
Merci beaucoup.
J'ai une autre question :
Je crée un tableau dynamique à 2 (respectivement 3) dimensions, comment le passer en paramètre d'une fonction afin d'allouer l'espace ? afin de l'initialiser ? afin de le remplir ?
Merci...
J'ai une autre question :
Je crée un tableau dynamique à 2 (respectivement 3) dimensions, comment le passer en paramètre d'une fonction afin d'allouer l'espace ? afin de l'initialiser ? afin de le remplir ?
Merci...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
oliver91
Messages postés
51
Date d'inscription
lundi 21 mai 2007
Statut
Membre
Dernière intervention
9 septembre 2009
3
22 mai 2007 à 18:35
22 mai 2007 à 18:35
Voici un menu :
Je ne comprends pas, il m'indique : 'TermTab undeclared (first used in this function ...
Je ne vais pas déclarer mon tableau ds mon menu ?
Je suis bien obliger de lui mettre TermTab en parametres afin qu'il le remplisse ...
Aidez-moi svp ...
menu_1(){ int choix_1; do { printf("\n\t\t Menu 1 :\n\n"); printf("\nTapez 1 afin de commencer\n"); printf("\nTapez Q pour QUITTER ou bien pressez la touche Echap\n"); printf("\n\n\n Votre choix : "); choix_1 = getch(); switch (choix_1) { case '1': printf("\nChoix 1\n");system("cls");apartirdeTermFic(TermTab);apartirdeProdFic();system("cls");menu_2(); case 27: printf("\n\n\nTouche Echap\n");sleep(300);break; case 'Q': printf("\n\n\nSortie ...\n");sleep(300);break; default: printf("\n\n\nErreur de saisie\n");sleep(300); } system("cls"); } while (choix_1!=27 && choix_1!='Q'); }
Je ne comprends pas, il m'indique : 'TermTab undeclared (first used in this function ...
Je ne vais pas déclarer mon tableau ds mon menu ?
Je suis bien obliger de lui mettre TermTab en parametres afin qu'il le remplisse ...
Aidez-moi svp ...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
22 mai 2007 à 23:21
22 mai 2007 à 23:21
Termtab n'est pas connu dans ta fonction. Termtab est une variable locale. Ce que tu fais, tu fais passer ton tableau termTab en argument de ton menu_1();
oliver91
Messages postés
51
Date d'inscription
lundi 21 mai 2007
Statut
Membre
Dernière intervention
9 septembre 2009
3
22 mai 2007 à 23:27
22 mai 2007 à 23:27
mais comment passer mon tableau dyn à 2 dim du main vers sa fonction de 'remplissage' puis de nouveau dans le main puis vers sa fonction d'affichage ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
22 mai 2007 à 23:30
22 mai 2007 à 23:30
Comme ceci :
int main(){
char **tab;
init(tab);
/*ici tab est initialise*/
affich(tab);
/*ici on a affiche tab*/
return 0;
}
int main(){
char **tab;
init(tab);
/*ici tab est initialise*/
affich(tab);
/*ici on a affiche tab*/
return 0;
}
oliver91
Messages postés
51
Date d'inscription
lundi 21 mai 2007
Statut
Membre
Dernière intervention
9 septembre 2009
3
22 mai 2007 à 23:57
22 mai 2007 à 23:57
Merci, je vaid dodo. Surement à demain ;) B.nuit