Partage
  • Partager sur Facebook
  • Partager sur Twitter

Conseils en tout genre

    10 novembre 2007 à 14:50:01

    Bonjour tout le monde.
    Je suis en train de coder un programme simple; et je n'ai que, pour le moment, un bonhomme qui se déplace ( je travail avec la SDL ).
    Mais il y a des choses qui m'intrigue:

    - Comme dans le code de M@teo21 avec le Sokoban, j'ai une variable map et une fonction chargerMap. Mais je ne comprends pas pourquoi on peut modifier "map" dans la fonction sans utilisé un pointeur !?!?

    - Je me demandais aussi si c'était une bonne idée de mettre ma fonction "deplacer" en inline. Car certe c'est une grosse fonction mais elle est trés souvent appellé!

    - Est ce que true est égal à 1 et false à 0 ?

    Désolé si c'est question on déja été posé, je ne les ai pas trouvé.

    Merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      10 novembre 2007 à 15:34:29

      Bonjour à toi ! :)

      Citation : Sidus

      - Comme dans le code de M@teo21 avec le Sokoban, j'ai une variable map et une fonction chargerMap. Mais je ne comprends pas pourquoi on peut modifier "map" dans la fonction sans utilisé un pointeur !?!?



      Tu veux dire en faisant ça ?

      1. void chargerMap(int map[][Y])
      2. {
      3.     map[i][j]= truc;
      4.     ...
      5. }
      6. [...]
      7. int map[X][Y];
      8. chargerMap(map);


      Car tout simplement un tableau est un pointeur. Quand tu tape "map" dans ton code sans précision supplémentaire (sans les []), en fait c'est comme si tu écrivais son adresse.
      Et quand tu le modifies dans la fonction, tu modifies l'original et non une copie.

      Pour conclure en fait, la fonction ci-dessus a deux prototypes possibles différents :
      void chargerMap(int map[]);
      void chargerMap(int *map);


      Là j'ai simplifié avec un tableau mono-dimensionnel mais ça marche aussi quand y'a deux dimensions (ou +), avec même une possibilité en plus ;)

      void chargerMap(int map[][Y]);
      void chargerMap(int *map[]);
      void chargerMap(int **map);


      Citation : Sidus

      - Je me demandais aussi si c'était une bonne idée de mettre ma fonction "deplacer" en inline. Car certe c'est une grosse fonction mais elle est trés souvent appellé!



      Heu, ça dépend. Si elle n'est pas appelée à beaucoup trop d'endroits différents alors oui c'est une très bonne idée même.
      Mais sinon sache que des fois le compilateur inline automatiquement certaines fonctions sans que tu le lui est précisé explicitement de le faire, ça fait partie de son travail d'optimisation du code compilé. :)

      Citation : Sidus

      - Est ce que true est égal à 1 et false à 0 ?



      Tout à fait ! :)

      • Partager sur Facebook
      • Partager sur Twitter
        10 novembre 2007 à 15:55:10

        :D Génial, je te remercie pour tes réponses qui furent trés fructueuses !
        J'aurai surement d'autres questions a venir!

        Merci !
        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2007 à 16:09:40

          Citation : marcus

          Tout à fait ! :)


          Non non et non!
          il faut bien être claire, et avoir ça dans l'esprit! Puisque vous parlez du socoban, alors c'est du C, en C faux=0, alors que vrai vaut toute valeur différente de zéro, il faut que ça soit bien dans l'esprit, il ne faut pas prendre les choses fondamentales à la légère!
          • Partager sur Facebook
          • Partager sur Twitter

          La maîtrise des fondamentaux est le fondamental de la Maîtrise.

            10 novembre 2007 à 17:22:23

            On ne peut donc pas connaitre la valeur de true ?

            (Certe j'ai parlé du sokoban mais je code quand même en C++ ( toute facon le type bool n'existe pas en C ))
            • Partager sur Facebook
            • Partager sur Twitter
              10 novembre 2007 à 17:40:07

              Citation : fissal_houate

              Citation : marcus

              Tout à fait ! :)


              Non non et non!
              il faut bien être claire, et avoir ça dans l'esprit! Puisque vous parlez du socoban, alors c'est du C, en C faux=0, alors que vrai vaut toute valeur différente de zéro, il faut que ça soit bien dans l'esprit, il ne faut pas prendre les choses fondamentales à la légère!



              De même en C++. La norme spécifie simplement que true !=0. Petit exemple débile pour vérifier que la condition est true :

              Il ne faut pas faire :

              1. if (condition == 1)
              2. {
              3.       //traitement...
              4. }


              mais plutôt

              1. if (condition)
              2. {
              3.      //traitement...
              4. }


              Pour la condition false, même si elle vaut effectivement 0, dans un soucis de sémantique je déconseille de faire un test de valeur. Ainsi :

              1. if (!condition)
              2. {
              3.     //traitement...
              4. }


              me semble mieux que

              1. if (condition == 0)
              2. {
              3.     //Traitement...
              4. }
              • Partager sur Facebook
              • Partager sur Twitter
                10 novembre 2007 à 18:42:43

                Ok impeccable! Encore merci pour votre aide.
                • Partager sur Facebook
                • Partager sur Twitter
                  13 novembre 2007 à 21:19:08

                  Citation : fissal_houate

                  Citation : marcus

                  Tout à fait ! :)


                  Non non et non!
                  il faut bien être claire, et avoir ça dans l'esprit! Puisque vous parlez du socoban, alors c'est du C, en C faux=0, alors que vrai vaut toute valeur différente de zéro, il faut que ça soit bien dans l'esprit, il ne faut pas prendre les choses fondamentales à la légère!



                  Ne le prend pas mal, mais j'aurais quelques remarques à faire.

                  Ce que tu me dis je l'ai parfaitement à l'esprit. Je sais très bien que lorsqu'une expression est évaluée dans le but d'être booléenne que différent de 0 veut dire vrai et zéro, faux.

                  Or ici on ne parle pas d'évaluation d'une expression mais bel et bien de true et false qui sont des constantes du C++.
                  Si on regarde la définition d'un booléen, on sait qu'il n'y a que deux valeurs possibles, en informatique cela correspond à la position ouverte (FAUX) ou fermée (VRAI) d'un circuit électrique.
                  On note ces états 0 et 1, ce sont ce que valent false et true, on ne va pas dire qu'on utilise 27 pour vrai par exemple, ce serait totalement illogique et pour que la représentation électrique soit cohérente, il faudrait un peu plus de un bit (ce qui ne serait plus vraiment un booléen car plus de 2 valeurs différentes possibles) !

                  Déjà, comment peut-tu prétendre que parce que l'on ai parlé du sokoban que ça soit forcément du C ? On se trouve dans la section C++ du forum là.



                  dangerous > Tout à fait d'accord avec toi, pour les tests de booléens il convient d'utiliser la méthode que tu as décrite.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 novembre 2007 à 22:57:03

                    en fait true et false ne sont pas des constantes mais des mots clés (une constantes se "déconstantisable"*, pas le mot clé ;) )

                    Ensuite pour ce qui est de la valeur de true et de false, devenez de grandes personnes et faites vos test :

                    1. int main()
                    2. {
                    3.     int i = (int)true;
                    4.     if( i )
                    5.     {
                    6.     std::cout << i << std::endl;
                    7.     }
                    8.     i = (int)false;
                    9.     if( !i )
                    10.     {
                    11.         std::cout << i << std::endl;
                    12.     }
                    13.     return 0;
                    14. }



                    * const_cast
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 novembre 2007 à 23:31:47

                      Citation : MatteX

                      en fait true et false ne sont pas des constantes mais des mots clés



                      Tout à fait ! Quand je voulais dire constante je parlais de ça bien évidemment, pas des defines ou des const machin chose ! :p (je n'ai pas employé le terme exact de chez exact)

                      déconstantisable ? lol :p
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 novembre 2007 à 17:07:32

                        ReSalut chers camarades ! Je suis de retour avec une nouvelle question ! :D
                        Alors voila, dans mon programme, j'utilise un tableau d'une structure que j'ai créée.
                        Le probleme est que j'aimerai pouvoir changer la taille de mon tableau en cours de programme. C'est a dire, par exemple: imaginons que mon tableau soit de la forme garde[nbgardes], et que je veuille en rajouter un ( garde ) ! Comment faire ?
                        Il y a certe la méthode barbare qui consiste a creer un tableau de 50 et comme ca je ne serai pas embeter, mais c'est n'est pas trés .... "optimal" :lol:

                        Auriez-vous une solution ?



                        Je me demandais si ceci pouvait être une solution correcte:

                        1. int *tableau = NULL;
                        2.      int taille = 10;
                        3.      tableau = new int[taille];
                        4.      taille = 20;
                        5.      tableau = new int[taille];
                        6.      delete[] tableau;

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          24 novembre 2007 à 17:41:37

                          Si tu veux faire via des new et delete, n'oublie pas de faire delete avant de refaire un new! Il te faut un tableau temporaire, ou un tableau cible.
                          L'alternative est std::vector. Je te laisse faire qq recherches dessus, le fonctionnement n'est pas trop compliqué.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 novembre 2007 à 18:04:57

                            Ok merci, je viens de voir ce que donne les "vector". Ca a l'air bien mais j'ai peur de m'embrouiller l'esprit plus qu'autre chose en les utilisant. Je vais reflechir.
                            En tout cas merci pour ton aide et ton conseil !
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              24 novembre 2007 à 18:23:04

                              Je vois pas comment on peut s'embrouiller l'esprit avec la stl :-°
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 novembre 2007 à 6:00:31

                                on peut s'embrouiller avec le T de la STL. C'est un outil fabuleux la meta-programmation mais c'est comme divulguer que la terre est ronde au 9e siecle à des programmeurs qui ne l'ont jamais utilisé.

                                Sidus, t'inquiète pas : les vecteurs ne morts pas et ne feront pas de toi un moins bon programmeur ou plus paresseux, c'est plutôt une force du langage C++!
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 juin 2008 à 13:37:10

                                  Bonjour! Je déterre mon topic car j'ai une nouvelle question:
                                  Avec la SDL, y a t il moyen de forcer une image à se blitter par dessus les autres ? Je m'explique : j'ai besoin de coder un truc du genre

                                  SDL_BlitSurface(Surface1, ..., &pos);
                                  SDL_BlitSurface(Surface2, ..., &pos);
                                  


                                  mais je veux que ce soit l'image 1 qui soit dessus. ( je ne peux pas juste changer l'ordre )

                                  Merci pour vos réponses !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    17 juin 2008 à 14:08:06

                                    Ne déterre pas les topic comme ça, recrée en. Surtout que ce n'est pas le sujet.

                                    Pour répondre à ta question, l'affichage se fait à chaque fois "par dessus" ce qui existe. Si tu veux que ce soit la surface1 qui soit dessus la 2, alors affiche la après.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 juin 2008 à 10:04:01

                                      Primo je préfére deterrer mon topic, déja parce que c'est le mien, ensuite parce que c'est toujours le sujet ( "Conseil en tout genre") et pour finir je trouve plus malin d'avoir toutes les réponses a mes questions au même endroit.
                                      (Par contre si même les modérateurs préférent que je créé un nouveau topic, alors je le ferai.)

                                      Secondo, j'aurai préféré que tu lises ma question en entière :

                                      Citation : Sidus

                                      ( je ne peux pas juste changer l'ordre )


                                      Mais je te remercie pour ta réponse quand même.

                                      N'existe t il donc point une façon de forcer l'ordre d'apparition des images ?


                                      De plus j'ai une autre question: Est il possible d'enregistrer plusieurs images en une. Je m'explique: durant l'execution de mon code, je blite 2 images sur mon ecran, par exmple surface1 et surface2. Ce que je voudrai c'est une fonction qui renverai une seul image dans laquel il y aurai mes 2 surfaces.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        19 juin 2008 à 12:49:15

                                        Pourquoi il ne faut pas déterrer de vieux topic ? Parce que ceux qui vont te lire vont lire depuis le début et perdre leur temps. En plus si tu crées un nouveau topic la recherche pour les _autres_ est plus facile. (Dans le sens : y a pas que toi qui te pose cette question ci, ou celle là, ...)

                                        Tu peux après (pour l'ordre d'affichage) créer une classe qui s'occupe de gérer la profondeur. (Du style un conteneur trié en fonction de Z et qui s'affiche dans l'ordre.)

                                        Pour ta dernière question, j'ai pas bien compris, tu veux les superposer, les mettre à côté de l'autre, dans un fichier, ... ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          21 juin 2008 à 12:53:16

                                          Bon OK je créé un nouveau topic :)
                                          Pourrais tu m'expliquer un peu plus ta technique pour blitter dans l'ordre que je veux s'il te plaît? Voici le lien du nouveau topic: Questions sur la SDL

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Conseils en tout genre

                                          × 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