IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Initialiser et afficher un tableau avec 2 fonctions sans param�tres


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2024
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 43
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Novembre 2024
    Messages : 3
    Par d�faut Initialiser et afficher un tableau avec 2 fonctions sans param�tres
    Bonjour � tous, je suis d�butant en programmation en C et j'ai une question sur le programme ci-dessous.

    R�sum� sur le programme :
    • compos� de deux fonctions, la 1ere void initialise_Nb_jours() initialise un tableau avec le nombre de jours du mois { 31 28 31 30 31 30 31 31} .
    • la 2eme fonction void affiche() affiche le tableau initialis� par la fonction pr�c�dente.
    • les deux fonctions sont sans param�tres d'entr�es et sans param�tres de sorties. Au d�but de la fonction main, j'ai appel� la fonction initialise_Nb_jours(), ensuite la fonction affiche().


    Ma question : malgr� le fait que les deux fonctions n'aient aucun param�tre d'entr�e ni aucun param�tre de sortie, qu'elles ne retournent aucune valeur et malgr� le fait que le tableau Nb_jours[13] soit un pointeur propre � la fonction initialise_Nb_jours(), le tableau affiche_Nb_jours[] (d�clar� dans la 2eme fonction affiche() ) arrive � pointer sur les valeurs du tableau Nb_jours[13] afin de les afficher.

    SVP, pouvez vous m'expliquer cela ?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
     
    /* Fonction qui initialise le tableau Nb_jours */
    /* Paramètre d'entrée : aucun                  */
    /* Paramètre de sortie : rien                  */
     
    void initialise_Nb_jours()
    { int Nb_jours[13];
     
      /* Déclaration d'un compteur de mois */
      int RangMoins;
     
      /* Pour tous les mois de l'année */
      for(RangMoins = 1; RangMoins <= 12 ; RangMoins++)
      { /* Si mois est février */
        if(RangMoins == 2)
     
          /* Alors le nombre de jours est 28 */
          Nb_jours[RangMoins] = 28;
     
          /* Sinon, si le rand du mois est pair et <=7 ou impair et >7 */
          /* Alors le nombre de jours est 30                           */
          else if((RangMoins % 2 == 0 && RangMoins<=7) || (RangMoins % 2 != 0) && RangMoins>7)
          Nb_jours[RangMoins] = 30;
     
          /* Sinon le nombre de jours est 31 */
          else Nb_jours[RangMoins] = 31;
      } 
    }
     
    /* Fonction qui affiche le tableau Nb_jours */
    /* Paramètre d'entrée : aucun               */
    /* Paramètre de sortie : rien               */
     
    void affiche()
    { int affiche_Nb_jours[13];
     
      /* Déclaration d'un compteur de mois */
      int RangMoins;
     
      /* Pour tous les mois de l'année */
      /* Afficher le nombre de jours pour le mois en cours */
     
      for(RangMoins = 1; RangMoins <= 12 ; RangMoins++)
      printf("Le mois numero %d  de l'annee a %d jours\n", RangMoins, affiche_Nb_jours[RangMoins]);
    } 
     
    /****************************************************************************************/
    /*                               Programme principal                                                                                               */
    /****************************************************************************************/
     
    void main(void) 
    {
     /* Initialisation de Nb_jous */
     initialise_Nb_jours();
     
     /* Affichage de contenu du tableau */
     affiche(); 
    }

  2. #2
    Membre chevronn�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Septembre 2015
    Messages
    213
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 48
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 213
    Par d�faut
    bonjour

    d�j� utilise la balise "CODE" pour la lisibilit� de ton code

    ton code fonctionne, car le compilateur a utilis� les m�mes zones de m�moire pour tes 2 fonctions
    lors de la compilation de la 2�me fonction, il savait qu'il pouvait r�utiliser la zone m�moire de la 1�re fonction (car interne � la 1�re fonction)


    si par exemple, tu rajoutes entre initialise_Nb_jours(); et affiche(); un appel � une nouvelle fonction :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void ma_fonction ()
    {
        int tab[7];            /* je prends volontairement une valeur plus petite pour que tu vois qu'il va peut-être écraser une partie de la mémoire) */
        for (int i=0;i<7;i++)tab[i]=2;
    }
     
    ...
    {
        initialise_Nb_jours();
        ma_fonction ();   /* appel à la nouvelle fonction */
        /* Affichage de contenu du tableau */
        affiche();
    }
    mais tu restes sur un comportement ind�fini (tout d�pend de comment le compilateur g�re sa m�moire)

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2024
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 43
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Novembre 2024
    Messages : 3
    Par d�faut
    Merci beaucoup pour ta r�ponse d�taill�e.

  4. #4
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par d�faut
    Je ne comprends
    • ni le but de l'exercice: travailler avec les variables globales. mais pourquoi ?
    • ni l'utilit� de l'exercice: utiliser les variables globales. Sauf cas sp�cifiques (l'embarqu� par exemple), les variables globales sont � �viter
    • ni ce qu'il faut faire: afficher juste 30 et 31 pour le mois 1 � 12 c'est moche


    1 solution
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    30
    31
    32
    #include <stdio.h>
    #include <stdlib.h>
     
     
    char list_nb_days[12];
     
    void init_nb_days() {
        list_nb_days[0] = list_nb_days[2] = list_nb_days[4] = list_nb_days[ 6] =
                          list_nb_days[7] = list_nb_days[9] = list_nb_days[11] = 31;
     
        list_nb_days[3] = list_nb_days[5] = list_nb_days[8] = list_nb_days[10] = 30;
     
        list_nb_days[1] = 28;
    }
     
    void display_nb_days() {
        char day;
     
        for(day=0; day < 12; ++day) {
            printf("month %2d, number of days: %d\n", (day + 1), list_nb_days[day]);
        }
    }
     
     
    int main()
    {
        init_nb_days();
        display_nb_days();
     
     
        return EXIT_SUCCESS;
    }

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2024
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 43
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Novembre 2024
    Messages : 3
    Par d�faut :|:|:|:|:|:|
    Je suis d�butant et j'ai rien compris dans tous ce que tu as dit.

    Pour r�sumer, je m'entraine � programmer en C pour �voluer. C'est un programme que j'ai retrouv� dans un livre, le tableau est d�clar� en global.
    J'ai effectu� une petite modification, j'ai supprim� le tableau d�clar� en globale et je l'ai remplac� par deux tableaux en local pour chaque fonction et le r�sultat �tait le m�me.
    J'avais un doute que le compilateur utilise la m�me zone m�moire pour les deux tableaux, du coup j'ai pos� la question ici et j'ai eu la confirmation de Xelland.

  6. #6
    Expert confirm�
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    F�vrier 2008
    Messages
    2 315
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par d�faut
    Bonjour.

    Pour essayer de faire le plus simple possible (je vais tenter de vulgariser au maximum ) en C (et en C++ aussi) ce qu'il faut avoir en t�te c'est la division de la m�moire en deux parties distinctes:
    • la m�moire dans la pile ;
    • la m�moire dans le tas.


    La pile

    Tout d'abord sa taille. Elle est d�finie par ton syst�me d'exploitation. En g�n�ral 1Mo. Mais bien entendu elle peut �tre diff�rente. Il est aussi possible de la modifier. En r�gle g�n�rale personne n'y touche.

    � quel moment je sais que j'utilise cette m�moire ?
    C'est tout simple. Un bloc m�moire est allou� � chaque fois que tu ouvres une accolade . Chaque fonction est d�finie par une paire d'accolades. � l'int�rieur je peux donc d�clarer des variables sans d�passer la taille allou�e. Tu peux faire un essai en d�clarant par exemple un tableau de int d'une taille de 10Mo. Regarde le r�sultat en console .

    Quelle est la dur�e de vie des variables d�clar�es dans une parie d'accolades ?
    La r�ponse est dans la question. Tant que ton code reste dans les accolades les variables d�clar�es � l'int�rieur perdurent. Ainsi si tu appelles une fonction � l�int�rieur d'une paire d'accolades et que tu y transmets ces variables, elles seront toujours viables dans la fonction appel�e.

    Le tas

    Le tas correspond au reste de la m�moire de la machine sur laquelle tourne ton application. Pour y acc�der nous faisons une allocation dynamique. C'est � dire nous utilisons la fonction malloc() (et ses d�riv�es). Cette m�thode permet de d�passer la limitation que nous impose la taille de la pile.
    Et c'est l� que nous allons entrer dans les probl�mes . Qui dit allocation dynamique dit lib�ration des blocs devenus inutiles. Ceci se fait avec la fonction free(). Bon nombre de programmeurs oublient de lib�rer certains blocs ce qui peut entrainer le crash de l'application et aussi permettre certains exploits pour p�n�trer dans les syst�mes. Mais �a c'est une autre histoire.


    En r�sum� avoir des variables globales, c'est � dire accessibles en tout point du programme est � fortement �viter. Le code devient rapidement difficile � maintenir voir � d�boguer. L'art du C (et du C++) est en grande partie contenu ici. Arriver � faire en sorte de ne pas en avoir. Pour y parvenir il te faut maitriser les deux notions d�crites ici. J'esp�re avoir pu apporter une petite pierre � ta compr�hension.

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 418
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 418
    Par d�faut
    Si �a fonctionne c'est parce que le compilateur aura pris la libert� de compiler les deux fonctions en "inline", c'est � dire aura plac� leur contenu dans la fonction principale.
    Ce qui �vite en arri�re plan, au bas niveau, les CALL et RET... C'est de l'optimisation de code !!!

    Par contre, il faut respecter tout ce qui a �t� dit sur les d�clarations globales, locales et la PILE (qui est ici un dispositif de bas niveau... niveau CPU) !

Discussions similaires

  1. R�ponses: 0
    Dernier message: 10/05/2012, 08h33
  2. afficher des images avec une fonction
    Par wilfried_42 dans le forum Contribuez
    R�ponses: 0
    Dernier message: 16/09/2008, 20h03
  3. R�ponses: 4
    Dernier message: 17/07/2008, 12h24
  4. R�ponses: 2
    Dernier message: 07/06/2007, 16h07
  5. cacher et afficher un tableau avec un "radio button"
    Par chrix10.2 dans le forum G�n�ral JavaScript
    R�ponses: 2
    Dernier message: 10/01/2007, 20h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo