Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cours #4 C++

Petites questions ?

    1 décembre 2005 à 23:07:06

    Bonjour bonjour,

    Bien que je respecte largement mister M@teo pour son travail, je voudrais apporter quelques précisions/incohérences à son petit cours sur les variables... voire même poser des questions...

    1)
    int main(int argc, char *argv[])
    {
      long age = 0; // On initialise la variable à 0
     
      printf("Quel age avez-vous ? ");
      scanf("%d", &age); // On demande d'entrer l'age avec scanf
      printf("Ah ! Vous avez donc %d ans !\n\n", age);
     
      system("PAUSE");     
      return 0;
    }


    De mon point de vue, soit au moment d'appuyer sur "entrée" le dernier message "ah vous avez donc..." s'affichera trop vite pour que vous le voyez, soit ce sera au prochain lancement du programme, qu'il prendra l'équivalent du "entrée" à la place de votre âge...

    Je me trompe peut être hein !

    2) 1ère question du QCM sur les variables (et accessoirement la partie du cours qui y fait référence ;)) :
    Quand on déclare une variable, quelle mémoire utilise-t-on ?


    A cette question, on pourrait répondre vite fait : la mémoire vive ? mais en fait, tout dépend du type de déclaration fait, et accessoirement de l'espace mémoire restant ! (je pense que de ce point de vue, M@teo n'a pas voulu aller trop loin, mais il vous faut savoir qu'on peut "forcer" l'endroit où on souhaiterais bien stocker sa petite variable...

    3)
    Quelle est la seule mémoire qui n'est pas vidée lorsque l'ordinateur est éteint ?


    Pas d'accord avec la question et les réponses associées... la mémoire morte est aussi une mémoire qui ne se vide pas complétement...
    Comment votre PC boot à votre avis ?


    Voila, j'ai assez fait mon lourdeau je crois et je suis navré d'en avoir fait une tartine...

    Je suis ouvert à toute explication bien entendu, puisque je peux me tromper (ben oui, je suis pas non plus un boss du C ^^ même avec 6 ans de coding ^^)

    Merci de m'avoir lu !
    • Partager sur Facebook
    • Partager sur Twitter
      1 décembre 2005 à 23:19:04

      Citation : YanisLiadon

      A cette question, on pourrait répondre vite fait : la mémoire vive ? mais en fait, tout dépend du type de déclaration fait, et accessoirement de l'espace mémoire restant ! (je pense que de ce point de vue, M@teo n'a pas voulu aller trop loin, mais il vous faut savoir qu'on peut "forcer" l'endroit où on souhaiterais bien stocker sa petite variable...


      On ne peut pas forcer de valeurs dans les registres ou le cache sauf en ASM (et encore que pour le cache on ne contrôle pas entièrement).
      En C tu n'as pas ce genre de notions à priori, ce que fait le système de tes variables est son problème, il n'y a aucune notion de RAM, de cache, de swap ; tu n'utilises que la mémoire linéaire.
      Donc moi je pense que c'est complètement à côté que de parler de tout ça mais bon.

      ps : Evidemment que ton système peut te proposer de t'aider dans ta tâche en ayant des mécanismes pour l'histoire du swap et du mappage de la mémoire mais bon ce n'est plus du C pur après...
      • Partager sur Facebook
      • Partager sur Twitter
        1 décembre 2005 à 23:26:04

        Merci de ta réponse rz0, en fait, j'attendais ton intervention sur ce petit speach ;)

        Concernant ta remarque, je ne suis vraiment pas d'accord... il existe des classes d'allocation qui déterminent, pour un identificateur, sa durée de vie, sa portée et son emplacement. l'un d'entre eux est "register".

        Il permet, lors de la déclaration d'une variable locale, de dire au compilateur qu'on va utiliser une variable de ce type (register int i; pour la déclaration) de manière plus ou moins intensive... et qu'elle doit être allouer de manière à minimiser les temps d'accès, si possible dans un registre machine (et là où tu as raison, c'est que j'ai bien mis "si possible" ;))...
        • Partager sur Facebook
        • Partager sur Twitter
          1 décembre 2005 à 23:31:46

          Je m'attendais à ce qu'on me cite cela mais je réplique que :

          Je connais ce reliquat du C k&r qui est en fait ignoré par la majorité des compilateurs. De plus le standard dit simplement : "A declaration of an identifier for an object with storage-class specifier register suggests that access to the object be as fast as possible."
          Cela n'implique donc _pas_ que la variable sera dans un registre contrairement à ce que le nom indique le standard ne fait aucune référence à un quelconque registre machine ; il n'y a donc même pas de possibilité, c'est entièrement arch-dependent donc non tu ne choisis pas où est placée ta variable.

          Les autres classes de stockage n'influent pas non plus sur ce genre de chose.
          • Partager sur Facebook
          • Partager sur Twitter
            1 décembre 2005 à 23:35:34

            Et je te réponds encore une fois en quotant mon message précédent :

            Citation : Message précédent

            (et là où tu as raison, c'est que j'ai bien mis "si possible" ;))



            J'ai étudié il y a presque deux an maintenant l'architecture des systèmes industriels, et les tests qu'on a pu nous faire faire nous ont bien montré que de temps à autre... on peut réussir à accéder aux registres de cette manière... bien que ca soit très (mais alors très) aléatoire ^^

            Edit : petit texte démontrant que tu as totalement raison mais que...

            Citation : http://www.linux-kheops.com/doc/ansi-c/node111.htm

            register a été introduit dans le langage pour optimiser les programmes. Avec les techniques modernes de compilation, il ne sert à rien car le compilateur est mieux à même que le programmeur d'allouer les registres de la machine de manière efficace. Ne pas oublier en outre, qu'il y a une contrainte attachée à l'utilisation de variables register : l'impossibilité de leur appliquer l'opérateur &.

            • Partager sur Facebook
            • Partager sur Twitter
              1 décembre 2005 à 23:41:59

              Je ne dis pas que ce n'est pas possible mais ce n'est pas standard donc pour moi ce n'est pas vraiment du C. :)

              C'est un comportement "aléatoire" (pour te citer) qui dépend de ton architecture donc au final ça peut très bien se retrouver là-bas mais tu n'en as pas le contrôle.
              De toute façon je trouve que c'est une aberration à ce niveau de parler d'allocation de registre étant donné que nous ne sommes même pas dans du bas niveau ou du code-performance ou quoi que ce soit et que quelque chose comme ça est dérisoire. Si on veut contrôler cela, autant faire de l'asm inline au lieu de placer des mots-clés antiques à tort et à travers.

              Voilà, pour moi, cela ne rentre plus dans le cadre du "C", disons que c'est du domaine de l'implémentation et qu'à haut et moyen niveau, il vaut largement mieux pour la sanité de nos programmes rester dans un cadre "virtuel" de mémoire linéaire, sinon on s'embarque dans quelque chose de dangereusement sale...

              Pour la note historique, oui, il y a une contrainte de non adressabilité et donc de non-aliasing avec une quelconque valeur pointée dans la fonction, mais à cet effet, C99 possède restrict donc...
              • Partager sur Facebook
              • Partager sur Twitter
                1 décembre 2005 à 23:46:41

                Nous sommes d'accord sur ce point (un peu depuis le début remarque ;))

                Concernant mon intervention, je voulais juste signifier que cela existait... voila tout !

                Loin de moi l'idée de vouloir apprendre des choses à d'autres personnes... sinon j'aurais fait prof ^^

                Merci pour cet échange en tous les cas !
                • Partager sur Facebook
                • Partager sur Twitter
                  2 décembre 2005 à 1:34:18

                  Citation : YanisLiadon

                  De mon point de vue, soit au moment d'appuyer sur "entrée" le dernier message "ah vous avez donc..." s'affichera trop vite pour que vous le voyez, soit ce sera au prochain lancement du programme, qu'il prendra l'équivalent du "entrée" à la place de votre âge...



                  et pourquoi? il y a bien un
                  system("PAUSE");
                  à la fin, qui permet don de lire la phrase en tout tranquillité
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 décembre 2005 à 7:07:14

                    Justement, l'affichage lié à cette instruction se fera !, mais en mémoire sera restée le code "entrée", ce qui provoquera, tôt ou tard, à valider la phrase générée par le system("PAUSE"), tout seul :)

                    C'est un problème de tampon... dû à l'utilisation du scanf... autant utilisé un fgets/gets/ou autre :)

                    Mais c'est encore une fois mon seul point de vue :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 décembre 2005 à 10:54:16

                      Citation : YanisLiadon

                      C'est un problème de tampon... dû à l'utilisation du scanf... autant utilisé un fgets/gets/ou autre :)


                      ta pas un exemple ? car moi je n'ai jamais rencontrer ce problème. :euh:
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 décembre 2005 à 11:19:43

                        Je n'ai pas trop le temps d'en faire un exemple, mais j'ai donné une réponse qui pourrait peut être t'éclairer ici

                        :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 décembre 2005 à 14:03:49

                          Citation

                          2) 1ère question du QCM sur les variables (et accessoirement la partie du cours qui y fait référence ;)) :

                          Quand on déclare une variable, quelle mémoire utilise-t-on ?



                          A cette question, on pourrait répondre vite fait : la mémoire vive ? mais en fait, tout dépend du type de déclaration fait, et accessoirement de l'espace mémoire restant ! (je pense que de ce point de vue, M@teo n'a pas voulu aller trop loin, mais il vous faut savoir qu'on peut "forcer" l'endroit où on souhaiterais bien stocker sa petite variable...



                          Et puis, s'il n'y a plus de mémoire vive disponible, le disque dur prends le relais, sous Windows (pour autres OS aucune idée)


                          Bisous
                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 décembre 2005 à 14:26:46

                            Citation : Gamer_man

                            Citation

                            2) 1ère question du QCM sur les variables (et accessoirement la partie du cours qui y fait référence ;)) :

                            Quand on déclare une variable, quelle mémoire utilise-t-on ?



                            A cette question, on pourrait répondre vite fait : la mémoire vive ? mais en fait, tout dépend du type de déclaration fait, et accessoirement de l'espace mémoire restant ! (je pense que de ce point de vue, M@teo n'a pas voulu aller trop loin, mais il vous faut savoir qu'on peut "forcer" l'endroit où on souhaiterais bien stocker sa petite variable...



                            Et puis, s'il n'y a plus de mémoire vive disponible, le disque dur prends le relais, sous Windows (pour autres OS aucune idée)




                            Bisous



                            Sauf que ça ne dépend pas du programmeur (c'ets pour ça par exemple qu'on te spécifie la rame minimal pour une utilisation optimale, c a d pas d'utilisation du swap).

                            Pour le registre, normalement, comme l'a dit Rz0, c'ets pas standard et le C est à un niveau trop haut pour vraiment l'utiliser. En plus, le compilo ou même l'ordi sait mieux que toi quelle est la meilleure solution pour une utilisation optimal (si tu distribue ton log, tu ne sais jamais vraiment comment est conçu le pc sur lequel il va être exécuté, ni la taille et le type de mémoire disponible.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 décembre 2005 à 16:04:16

                              Citation : minirop

                              Citation : YanisLiadon

                              C'est un problème de tampon... dû à l'utilisation du scanf... autant utilisé un fgets/gets/ou autre :)


                              ta pas un exemple ? car moi je n'ai jamais rencontrer ce problème. :euh:



                              #include <stdio.h>

                              int main(void)
                              {
                                  int a;
                                  do scanf("%d", &a);
                                  while (a != -1);
                                  return 0;
                              }


                              ce code marche très bien, mais si tu rentre une lettre, t'obtient une boucle infini car scanf bloque en lisant le caractère.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Cours #4 C++

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown