[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
Bonjour à tous,

j'aimerai savoir cmt se décompose un programme en C de manière générale ...

surtout d'un point de vue création de variables ...

car j'ai fait une fonction dans lequelle j'ai créer mes variables ... je fais un traitement dessus, puis elles les affiche ...

Or, maintenant, je veux à l'aide d'un menu pouvoir choisir de faire le(s) traitements ou bien par la suite de les afficher.

En clair j'aimerai séparé la fonction en plusieurs ...

Le problème qui se pose à moi est 1) de posé les bons paramètres (*... &... , etc) ; 2) de savoir où cré mes variables (dans le main ? dans la fonction qui fait les traitements ?)

Puissiez-vous, tant que vous y etes, bien vouloir m'expliquer quel serait l'interet (si il y a) de creer les variables ds le main ou bien ds la fonction de traitement ...

Merci beaucoup d'avance,
En esperant que votre réponse soit assez rapide, je vous remercie.

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
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.

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 à 18:06
Merci beaucoup.
0
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
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.
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 à 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...
0

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
Voici un menu :
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 ...
0
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
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();
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: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 ?
0
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
Comme ceci :

int main(){

char **tab;


init(tab);
/*ici tab est initialise*/

affich(tab);
/*ici on a affiche tab*/

return 0;
}
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
Merci, je vaid dodo. Surement à demain ;) B.nuit
0