{"id":439,"date":"2015-02-25T08:53:37","date_gmt":"2015-02-25T08:53:37","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=439"},"modified":"2016-09-02T13:33:45","modified_gmt":"2016-09-02T13:33:45","slug":"classe-commandlinemanager-pour-recuperer-les-parametres-de-ligne-de-commande","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=439","title":{"rendered":"Classe CommandLineManager pour r\u00e9cup\u00e9rer les param\u00e8tres de votre ex\u00e9cutable"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/Terminal-icon-shell-linux-unix.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-461\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/Terminal-icon-shell-linux-unix.png\" alt=\"Terminal-icon-shell-linux-unix\" width=\"256\" height=\"256\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/Terminal-icon-shell-linux-unix.png 256w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/Terminal-icon-shell-linux-unix-150x150.png 150w\" sizes=\"(max-width: 256px) 100vw, 256px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>[utiliser la classe DataParameters]<\/p>\n<p>On peut passer \u00e0 ex\u00e9cutable des param\u00e8tres comme suit : mon_ex\u00e9cutable.exe <em>-param1<\/em> <strong>arg1<\/strong> <strong>arg2<\/strong> <em>-param2<\/em> <strong>arg3<\/strong><\/p>\n<p>Cette classe va vous permettre de les r\u00e9cup\u00e9rer vos arguments plus facilement.<\/p>\n<p><strong>Pr\u00e9r\u00e9quis :<\/strong><\/p>\n<p>&#8211; Savoir lire du C<em>++<\/em><\/p>\n<p>&#8211; Savoir \u00e9crire un <em>programme rudimentaire<\/em>\u00a0 en C++<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le fichier d&rsquo;en-t\u00eate ParametersManager.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef PARAMETERS_MANAGER_H\r\n#define PARAMETERS_MANAGER_H\r\n\r\n\/**\r\n* \\brief Une classe pour g\u00e9rer les param\u00e8tres des arguments d'entr\u00e9e de\r\n* ligne de commande du programme.\r\n*\/\r\nclass Parameter\r\n{\r\npublic:\r\n\u00a0\u00a0\u00a0 Parameter(std::string sName);\r\n\u00a0\u00a0 \u00a0virtual ~Parameter();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Met un argument du param\u00e8tre\r\n\u00a0\u00a0\u00a0 void pushArgument(const std::string&amp; sArgument);\r\n\u00a0\u00a0 \u00a0\/\/ R\u00e9cup\u00e8re le nom du param\u00e8tre\r\n\u00a0\u00a0\u00a0 const std::string&amp; getName() const;\r\n\u00a0\u00a0 \u00a0\/\/ R\u00e9cup\u00e8re un argument\r\n\u00a0\u00a0\u00a0 const char* getArgument(unsigned int iArgumentNumber) const;\r\n\u00a0\u00a0 \u00a0\/\/ Retourne le nombre d'argument\r\n\u00a0\u00a0\u00a0 int getArgumentCount() const;\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0 std::string m_sName;\r\n\u00a0\u00a0\u00a0 std::vector&lt;std::string&gt; m_vArguments;\r\n};\r\n\r\nclass CommandLineManager : public Singleton&lt;CommandLineManager&gt;\r\n{\r\npublic:\r\n\u00a0\u00a0\u00a0 CommandLineManager(int argc, char* argv[]);\r\n\u00a0\u00a0\u00a0 ~CommandLineManager();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/ Est-ce que la ligne de commande a ce param\u00e8tre\r\n\u00a0\u00a0\u00a0 bool hasParameter(const std::string&amp; sParameter);\r\n\u00a0\u00a0 \u00a0\/\/ Le nombre de param\u00e8tre\r\n\u00a0\u00a0\u00a0 int getParameterCount();\r\n\u00a0\u00a0 \u00a0\/\/ R\u00e9cup\u00e8re le param\u00e8tre\r\n\u00a0\u00a0\u00a0 Parameter* getParameter(const std::string&amp; sParameter);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0\/\/ Evalue la ligne de commande\r\n\u00a0\u00a0\u00a0 void parseCommandLineArguments(int iArgumentCount, char* paArguments[]);\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, Parameter*&gt; m_vParameters;\r\n};\r\n\r\n#endif\r\n\r\n<\/pre>\n<p>Voici le fichier .cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ Format : -PARAM ARG1 ARG2...\r\nParameter::Parameter(std::string sName) :\r\nm_sName(sName)\r\n{\r\n}\r\n\r\nParameter::~Parameter()\r\n{\r\n}\r\n\r\n\/\/ On ajoute les arg1, arg2 \u00e0 la suite des un et des autres\r\nvoid Parameter::pushArgument(std::string sArgument)\r\n{\r\n\u00a0\u00a0 \u00a0m_vArguments.push_back(sArgument);\r\n}\r\n\r\nconst char* Parameter::getArgument(unsigned int iArgumentNumber)\u00a0 const\r\n{\r\n\u00a0\u00a0 \u00a0if (iArgumentNumber &lt; m_vArguments.size())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return m_vArguments[iArgumentNumber].c_str();\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return &quot;Unknown&quot;;\r\n}\r\n\r\nint Parameter::getArgumentCount() const\r\n{\r\n\u00a0\u00a0 \u00a0return m_vArguments.size();\r\n}\r\n\r\n\/********************************** D\u00e9claration de la classe CommandLineManager **********************************\/\r\n\r\nCommandLineManager::CommandLineManager(int argc, char* argv[])\r\n{\r\n\u00a0\u00a0\u00a0 parseCommandLineArguments(argc, argv);\r\n}\r\n\r\nCommandLineManager::~CommandLineManager()\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ Lib\u00e8re les objets param\u00e8tre de la m\u00e9moire.\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, Parameter*&gt;::iterator it;\r\n\u00a0\u00a0\u00a0 for (it = m_vParameters.begin(); it != m_vParameters.end(); ++it)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Parameter* pParam = (*it).second;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SAFE_DELETE(pParam);\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nvoid CommandLineManager::parseCommandLineArguments(int iArgumentCount, char* paArguments[])\r\n{\r\n\u00a0\u00a0\u00a0 Parameter* pCurrentParameter = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Exemple de ligne de commande : game.exe -fullscreen -res 800 600 -opengl\r\n\u00a0\u00a0 \u00a0for (int i = 0; i &lt; iArgumentCount; ++i)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 std::string sCurrentArgumentName(paArguments[i]);\u00a0\u00a0 \u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Si on a un nouvel argument qui commence par un '-'.\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sCurrentArgumentName[0] == '-')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ On enl\u00e8ve l'indicateur de param\u00e8tre (premier caract\u00e8re).\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sCurrentArgumentName.erase(0, 1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ On cr\u00e9\u00e9 un nouveau objet param\u00e8tre avec son nom.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pCurrentParameter = new Parameter(sCurrentArgumentName);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ On l'ajoute dans la liste des arguments.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_vParameters[sCurrentArgumentName] = pCurrentParameter;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (pCurrentParameter)\/\/ C'est peut-\u00eatre un argument, (param\u00e8tre qui ne commence pas par '-').\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pCurrentParameter-&gt;pushArgument(sCurrentArgumentName);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nbool CommandLineManager::hasParameter(const std::string&amp; sParameter)\r\n{\r\n\u00a0\u00a0\u00a0 return m_vParameters.count(sParameter) &gt; 0;\r\n}\r\n\r\nint CommandLineManager::getParameterCount()\r\n{\r\n\u00a0\u00a0\u00a0 return m_vParameters.size();\r\n}\r\n\r\nParameter* CommandLineManager::getParameter(const std::string&amp; sParameter)\r\n{\r\n\u00a0\u00a0\u00a0 if (m_vParameters.count(sParameter) &gt; 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return m_vParameters[sParameter];\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return nullptr;\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Utilisation :<\/strong><\/p>\n<p>On utilise ce bout de code dans la fonction main (int argc, char** argv) :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nCommandLineManager* pCommandLineManager = new CommandLineManager(argc, argv);\r\n\r\n\/\/ Bloc d'analyse des arguments de ligne de commande, etc...\r\nunsigned int iWindowWidth = SYSTEM_MINIMUM_WINDOW_WIDTH;\r\nunsigned int iWindowHeight = SYSTEM_MINIMUM_WINDOW_HEIGHT;\r\nbool bFullScreen = false;\r\n\r\n\/\/ Si on a au moins un param\u00e8tre.\r\nif (pCommandLineManager-&gt;getParameterCount() &gt; 0)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ Param\u00e8tre de r\u00e9solution de la fen\u00eatre\r\n\u00a0\u00a0 \u00a0if (pCommandLineManager-&gt;hasParameter(&quot;res&quot;))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Parameter* pWindowResParameter = pCommandLineManager-&gt;getParameter(&quot;res&quot;);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pWindowResParameter-&gt;getArgumentCount() &gt; 1)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Acquisition des param\u00e8tres de r\u00e9solution de la fen\u00eatre\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::string sResolutionWidth = pWindowResParameter-&gt;getArgument(0);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::string sResolutionHeight = pWindowResParameter-&gt;getArgument(1);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iWindowWidth = atoi(sResolutionWidth.c_str());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iWindowHeight = atoi(sResolutionHeight.c_str());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (pCommandLineManager-&gt;hasParameter(&quot;fullscreen&quot;))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0bFullScreen = true;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9 une <strong>m\u00e9thode<\/strong> pour <strong>analyser<\/strong> vos <em>arguments en ligne de commande<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : [utiliser la classe DataParameters] On peut passer \u00e0 ex\u00e9cutable des param\u00e8tres comme suit : mon_ex\u00e9cutable.exe -param1 arg1 arg2 -param2 arg3 Cette classe va vous permettre de les r\u00e9cup\u00e9rer vos arguments plus facilement. Pr\u00e9r\u00e9quis : &#8211; Savoir lire du C++ &#8211; Savoir \u00e9crire un programme rudimentaire\u00a0 en C++ Explications : Voici le fichier d&rsquo;en-t\u00eate [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/439"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=439"}],"version-history":[{"count":34,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/439\/revisions"}],"predecessor-version":[{"id":5738,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/439\/revisions\/5738"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}