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

Algorithmes et structures de données Discussion :

Gestion des options / switch d'un executable


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 55
    Points : 12
    Points
    12
    Par défaut Gestion des options / switch d'un executable
    Salut les amis !

    J'espère être au bon endroit pour poser ma question et que je vais réussir à être clair...

    Lorsque vous créer un script ou un executable qui sera lancé en ligne de commande avec des options / switchs style :

    mon_exe.exe filename.ext /A /B /C /D /E

    Comment gérez vous les différents cas de traitements de ces options qui parfois peuvent carrément être incompatibles ou mises dans le désordre?

    En effet certains vont lancer l'appli de cette façon :

    mon_exe.exe filename.ext /D /A

    D'autre de celle manière là :

    mon_exe.exe filename.ext /A /D

    Ou encore :

    mon_exe.exe filename.ext /A /B => avec /A et /B incompatibles

    Comment gérez vous tous ces cas? je suppose qu'il existe quelque part un algo simple qui répond à ma question, mais quel est il ?

  2. #2
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Il n'y a pas de méthode magique.
    Si pour toi, l'ordre des options n'a pas d'importance, tu peux simplement déclarer une variable par option acceptée et les initialiser à 0. Puis parcourir toutes les options données à ton programmes et mettre la variable correspondant à 1.

    Une fois que tu as la liste de toutes les options qui ont été données à ton programme, tu n'as plus qu'à vérifier que des options incompatibles n'ont pas été données. Là, pas de méthode magique, il faut que tu liste tous les cas d'options incompatibles. Et si tu trouve que la combinaison d'options données est incohérente : message d'erreur et arrêt du programme.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    J'ai toujours eu ce problème. Toujours. À chaque fois que j'écris un petit programme/script, je me retrouve à devoir choisir entre passer 2h à gérer les arguments de manière user-friendly ou faire un truc basique quitte à devoir modifier selon le besoin.

    Et moi qui code sous linux, je m'étonne toujours de ne pas avoir trouvé d'outil déjà fait qui permette une gestion intelligente des arguments. Il faut réinventer la roue à chaque fois !

    Une alternative : lorsque je le peux et lorsque c'est pertinent, je code en OCaml. Il y a un module tout fait (un genre de stl) qui gère ça de manière vraiment adéquate. Je me suis déjà retrouvé à coder l'interface en ligne de commande en OCaml et le cœur du programme dans un autre langage.
    -- Yankel Scialom

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    On peut toujours décrire la grammaire sous forme BNF et code un verificateur. Mais ca me semble un peu lourd.

    Pour ma part, je préfère définir les caractéristiques de chaque argument et les vérifier un par un.
    Argument {
      alias = "lettre ou mot"
      withArgument = yes/no
      mandatory = yes/no
      requires = { list of other Argument }
      forbids = { list of other Argument }
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    C'est vrai qu'il y a aussi les lib à la getopt.
    Ça simplifie un peu le parsing, mais je ne connais aucune lib qui soit capable de gérer l'exclusion mutuelle des options.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  6. #6
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    C'est un truc à coder ça. Le soucis c'est que c'est extrêmement langage-dépendant.
    -- Yankel Scialom

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Et moi qui code sous linux, je m'étonne toujours de ne pas avoir trouvé d'outil déjà fait qui permette une gestion intelligente des arguments. Il faut réinventer la roue à chaque fois !
    ???

    Prends n'impote quelle distrib, et regarde les main ..

    Ah.. C'est du C..

    Mais c'est pas compliqué.

    Tu fais une fois, et tu copies/colles..

    Faire un programme avec 12 options me prend environ 2 minutes.. pas 2h !!!

    Tu as, en première ligne du main

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( ! GetOptions ( argc, argc, &structparams )  )
     {
        Usage();
        return 1;
     }

    Et le GetOptions est simplement

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for ( i = 0 ; i < argc ; i++ )
      {
          if ( strcasecmp ( argv[i], "-i" ) == 0 )
            {
                ...
            }
          ...
      }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    C'est un peu plus complexe que ça ; il y a les options avec argument, avec argument optionnel, et parfois les arguments un peu complexes (qui doivent avoir leur syntaxe, etc) ; il y a les options qui vont toujours ensembles, et d'autres qui s'excluent mutuellement… Donc à chaque fois il faut coder un parseur d'option pour son programme, et au programme prochain il faut pratiquement tout refaire ; on ne prend jamais la peine de faire une fois pour toute une solution générale. Et oui, il faut pas 2h ; il m'arrive d'user et d'abuser de l'hyperbole.


    Edit −−−
    J'ai épluché le code source de ls, extrait de coreutils 5.0. En tout, il faut environ 1000 lignes juste pour le parsing des options. Il y a 58 options possibles pour ls. Soit en moyenne 17 lignes de code par options. Et je pense, vu la beauté du code de coreutils (voyez vous même, à part l'indentation pourrie c'est magnifique), je pense que c'est un minimum ; moins on a d'options, moins on a tendance à faire du code générique, et plus il faut de ligne/option. C'est une estimation très grossière, mais ça donne un ordre d'idée à ce qu'il faut faire pour bien gérer les options.

    Avec le parseur d'OCaml (qui est un langage haut niveau, la comparaison est difficile), de mémoire il ne me faut pas plus de 3-4 lignes / option (y compris des options complexes) + ~10 lignes.
    -- Yankel Scialom

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Honnêtement, ça ne jamais posé un problème...

    Je sais dans quels progs j'ai utilisé des arguments à option, je copie/colle..

    Quant aux mutuellement exclusifs d'une part il n'y en a pas des tonnes, et à celles qui vont toujours ensemble, c'est pareil...

    Franchement..

    Et ls (comme gcc) est quand même un des progs ayant le plus d'options..

    Honnêtement, c'est (de très très très très très très loin) pas un pbe... Si ???
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Non non non, c'est pas un problème. Mais l'intérêt de la programmation, c'est de ne jamais avoir à faire deux fois la même chose, non ?
    -- Yankel Scialom

Discussions similaires

  1. [MySQL] Gestion des options
    Par Heirem dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/11/2011, 16h14
  2. Gestion des options de la ligne de commande
    Par gl dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 18h38
  3. Gestion des options
    Par vikki dans le forum Qt
    Réponses: 4
    Dernier message: 12/02/2010, 23h14
  4. Réseau d'entreprise : Gestion des n° sur les switch
    Par snoopy69 dans le forum Windows XP
    Réponses: 1
    Dernier message: 24/04/2007, 12h16
  5. Réponses: 6
    Dernier message: 05/10/2005, 15h22

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