Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction main dans C++

    3 octobre 2007 à 16:23:29

    Bonjour j'aimerais savoir quel est le prototype exacte de la fonction main dans le C++?
    Je sais qu'il existe un prototype comme ca : int main() et comme ca int main(int argc, char** argv) mais j'aimerais savoir s'il est possible de recuperer les arguments sous forme d'objets string de facon a profiter de la puissance de cette classe et de toutes ces fonctions (et ne pas faire le "oldschool" strcmp pour verifier l'egalite de strings).

    J'espere avoir ete clair sinon je suis pret a repondre a vos questions.
    Merci d'avance pour toute aide!!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 octobre 2007 à 16:32:37

      Tu transforme char** argv en un string sans aucune difficultés.
      • Partager sur Facebook
      • Partager sur Twitter
        3 octobre 2007 à 17:39:37

        Le prototype est effectivement un char*.

        Tu peux par contre convertir facilement le char* en string via le constructeur de string:

        1. char* maChaineMoche;
        2. sting maChaine(maChaineMoche);
        • Partager sur Facebook
        • Partager sur Twitter
        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          5 octobre 2007 à 12:30:57

          1. if(argc!=0)
          2. {for(long i=0;i<=argc;i++)
          3.  {string nomFichier[i]=argv[i]}
          4. }
          5. je ne vois pas de difficulté majeur (une simple initialisation de string)
          • Partager sur Facebook
          • Partager sur Twitter
            5 octobre 2007 à 15:11:31

            Citation : neuneutrinos

            1. if(argc!=0)
            2. {for(long i=0;i<=argc;i++)
            3.  {string nomFichier[i]=argv[i]}
            4. }
            5. je ne vois pas de difficulté majeur (une simple initialisation de string)


            Ce code incompilable est faux!


            D'ailleurs j'ai de la misère à comprendre ce que tu voulais faire...

            Si c'était pour initialisé une collection de string : voici des solutions C++ viables
            1. #include <string>
            2. #include <vector>
            3. // solution 1: longue
            4. int main( long argc, char * argv[] )
            5. {  
            6.     std::vector<std::string> vArgs;
            7.     for( long i = 0; i < argc; i++ )
            8.     {
            9.         vArgs.push_back( std::string( argv[ i ] ) );
            10.     }
            11.     // ...
            12. }
            13. // solution 2: rapide 2 temps
            14. int main( long argc, char * argv[] )
            15. {
            16.     std::vector<std::string> vArgs;
            17.     vArgs.assign( argv, argv + argc );
            18.     // ...
            19. }
            20. // solution 3 : compression maximum
            21. int main( long argc, char * argv[] )
            22. {
            23.     std::vector<std::string> vArgs( argv, argv + argc );
            24.     // ...
            25. }



            La solution 3 se place très bien en début de programme, c'est extrèmement rapide à écrire et très rapide côté exécution et vu qu'on est assuré que argv est toujours initialisé on n'a pas de risque d'erreur... Au pire il ne s'agit que d'un "if( argc > 0 )". Habituellement argv[ 0 ] == Path du programme (enfin sur VC).

            j'ai utiliser la référence au tableau comme itérateur. N'hésitez pas si vous voulez des détails.


            [EDIT]J'ai corrigé le nom des objets après le commentaire de minirop[/EDIT]
            • Partager sur Facebook
            • Partager sur Twitter
              5 octobre 2007 à 20:01:06

              1. if(argc!=0)//si on envoie au moin un element au main
              2. {string nomFichier=new string[argc];//oublié desolé
              3. for(long i=0;i<argc;i++)//tant que l'on a pas lu tous les elements
              4.  {nomFichier[i]=argv[i]}//on le stock
              5. //mon erreur est d'avoir ecrit i<=argc (je lisais un ""element vide"")
              6. //est que je n'avais pas initialisé nomFichier convenablement
              7. /*...*/
              8. delete[] nomfichier;
              9. }


              le texte dans mon code etait accidentelle.
              Si tu souhaite tant utiliser les contneur utilise plutôt list(que je pense plus rapide ici)

              Citation : MatteX

              ce code incompilable est faux!

              :lol: donne moi un seul code incompilable juste :lol:

              • Partager sur Facebook
              • Partager sur Twitter
                5 octobre 2007 à 20:07:28

                neuneutrinos > le code de Mattex est incompilable mais juste (si tu corrige la petite erreur), alors que le tien c'est n'importe quoi.

                Mattex > le tien est aussi incompilable :-°

                Citation : ton code

                std::vector<std::string> vArgs;
                for( long i = 0; i < argc; i++ )
                {
                vArguments.push_back( std::string( argv[ i ] ) );
                }


                :D
                • Partager sur Facebook
                • Partager sur Twitter
                  5 octobre 2007 à 20:09:42

                  Ca donne envie de t'aider la manière dont tu réponds...

                  L'utilisation d'une list<> n'a ici aucun intéret. On veut juste stocker ces chaînes dans un tableau pas créer une liste qu'on va parcourir des milliers de fois et ajouter des éléments au milieu. De plus on veut certainement un accés en O(1) sur les éléments du tableau.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                    5 octobre 2007 à 21:09:24

                    dah, après plusieurs tests de performance, j'ai changé le nom de ma variable tellement de fois...

                    ouch! minirop, ça fait mal!

                    n'empèche que c'est la solution 3 qu'il faut retenir.

                    Neuneutrinos : Pourquoi une liste si c'est un tableau qu'on veut adapter. Je ne conseil pas l'utilisation d'un tableau dynamique pour un cas aussi simple.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 octobre 2007 à 21:21:46

                      voui ^^ mais pour "moi" je prefere utiliser new et delete

                      (pourquois ca serait n'importe quois???)

                      parce que j'utilise cette methode...(et elle marche)

                      list et vector n'utilise-il pas aussi une utilisation dynamique de la memoire?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 octobre 2007 à 21:28:38

                        Certe vector utilise l'allocation dynamique mais comme elle est encapsuler dans une classe qui la gère automatiquement il n'y a pratiquement pas d'erreur possible, de pertes de mémoires...

                        C'est niaiseux mais pour une solution aussi simple il est facile d'oublié le delete... de plus la STL offre des solution rapides et efficace de manipuler ses conteneurs.

                        les vectors sont aux tableaux dynamiques ce que les strings sont aux tableaux de char (dynamiques ou non)

                        Tu peux utiliser la technique qui te plait, je ne fais que proposer une solution rapide à implenter en une ligne et sans risque d'erreur...

                        [EDIT]Ton code est franchement trop lourd... et il est encore incompilable ( ";" :-° )[/EDIT]
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Fonction main dans 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