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

 C Discussion :

Peut-on améliorer ce code ?


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 258
    Points : 151
    Points
    151
    Par défaut Peut-on améliorer ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    if (argc<=1) {printf ("%s %s\n","Trop peu d'arguments","Syntaxe : camera.bin -i [image-sec] -d [nbr-jour]");exit(-1);}
            else if (argc >=6) printf("%s\n","Trop d'arguments");
            else if (argc ==5)
            {
     
                    for (i=1;i<=4;i++)
                    {
                            if  (!(strcmp(argv[i],"-i"))) 
                            {
                                    param1 = atoi(argv[i+1]);
                                    if ( (param1>=1) && (param1<=24) ) imsec=param1;
                                    else 
                                    {
                                            printf ("%s\n","valeur incorrecte de i (1-24)");
                                            exit (-1);
                                    }
                            }
                            if  (!(strcmp(argv[i],"-d"))) 
                            {
                                    param2 = atoi(argv[i+1]);
                                    if ( (param2>=1) && (param2<=12) ) duree=param2;
                                    else 
                                    {
                                            printf ("%s\n","valeur incorrecte de d (1-12)");
                                            exit (-1);
                                    }
                            }
     
     
                    }
     
            }
    Comme vous le voyez, je lance le programme camera de la façon suivante :

    ./ camera -i 10 -d 1

    Cela correspond à une vidéo de 10 images par seconde pour une journée entière de film.

    N'y a-t-il pas une manière plus élégante ( et plus fiable ) de tester les paramètres ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Bonjour,

    la gnu libc propose des parseurs de ligne de commande → Parsing Program Arguments. Si tu es sur une plateform *nix sans gnu libc tu as toujours l'option de la gnulib → GnuLib getopt Module.

    Sans framework, vouloir parser la ligne de commande peut vite produire un code spaghetti innommable.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 673
    Points : 10 683
    Points
    10 683
    Par défaut
    Je pense que ton code peut planter :./camera 10 10 10 -i
    Tu ne vérifies pas si argv[i+1] est valide

    Après pour ta question, oui et non
    En gros, si tu veux faire du code sûr lorsque tu parses les arguments, il faut coder 1 mini machine à états en :
    • catégorisant les bascules - les principales, les secondaires, les facultatives, les options (celles qui sont liées à 1 autre bascule), ...
    • fixant 1 ordre précis. Souvent certaines bascules doivent êtres mises avant ou après (notamment les options) d'autres

    C'est à peu près ce que font les bibliothèques spécifiques de parsage de paramètres.

    Dans ton cas. Tu as 2 bascules -i et -d
    • Si tu dis que -i est la première et -d la deuxième. Alors, argv[1] doit contenir "-i", argv[2] 1 valeur, argv[3] "-d" et argv[4] 1 valeur. Pas d'autre choix (donc argc doit valoir exactement 5)
    • Si tu dis que -d est facultative. Alors, argv[1] doit contenir "-i", argv[2] 1 valeur. Et en fonction de argc (3 ou 5) tester argv[3] et argv[4]
    • Si tu dis que tes 2 bascules sont interchangeables. Alors, argv[1] doit contenir soit "-i" soit "-d", et argv[3] l'autre bascule, argv[2] et argv[4] 1 valeur. Pas d'autre choix (donc argc doit valoir exactement 5)
    • ...

  4. #4
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 258
    Points : 151
    Points
    151
    Par défaut Je ne connaissais pas !
    getopt() à l'air cool.

    Je vais l'utiliser.

    Merci.

    La doc en français http://manpagesfr.free.fr/man/man3/getopt.3.html

    Citation Envoyé par WhiteCrow Voir le message
    Bonjour,

    la gnu libc propose des parseurs de ligne de commande → Parsing Program Arguments. Si tu es sur une plateform *nix sans gnu libc tu as toujours l'option de la gnulib → GnuLib getopt Module.

    Sans framework, vouloir parser la ligne de commande peut vite produire un code spaghetti innommable.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Une grosse optimisation à faire est d'intenter correctement le code pour le rendre lisible et maintenable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    if (argc <= 1) {
    	printf("%s %s\n", "Trop peu d'arguments", "Syntaxe : camera.bin -i [image-sec] -d [nbr-jour]");
    	exit(-1);
    } else if (argc >= 6)
    	printf("%s\n", "Trop d'arguments");
    else if (argc == 5) {
     
    	for (i = 1; i <= 4; i++) {
    		if (!(strcmp(argv[i], "-i"))) {
    			param1 = atoi(argv[i + 1]);
    			if ((param1 >= 1) && (param1 <= 24))
    				imsec = param1;
    			else {
    				printf("%s\n", "valeur incorrecte de i (1-24)");
    				exit(-1);
    			}
    		}
    		if (!(strcmp(argv[i], "-d"))) {
    			param2 = atoi(argv[i + 1]);
    			if ((param2 >= 1) && (param2 <= 12))
    				duree = param2;
    			else {
    				printf("%s\n", "valeur incorrecte de d (1-12)");
    				exit(-1);
    			}
    		}
    	}
    }

  6. #6
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 258
    Points : 151
    Points
    151
    Par défaut Ah ! v'là
    J'ai suivi vos conseils et suis arrivé à quelque chose de bien plus propre :

    .....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     if (argc==1) printf ("camera -i [1-24] img/sec -d [1-7] nbr-jour(s)-record\n");
     
            while ((c = getopt (argc, argv, "i:d:")) != -1)
                    switch (c)
                    {
                             case 'i':ivalue = optarg;
                                      break;
                             case 'd':dvalue = optarg;
                                      break;                        
                             case '?':if (optopt == 'i')
                                      fprintf (stderr, "Option -%c a besoin d'un argument.\n", optopt);
                                      else if (optopt == 'd')
                                      fprintf (stderr, "Option -%c a besoin d'un argument.\n", optopt);                              
                                      else fprintf (stderr,"Option inconnue `\\x%x'.\n",optopt);
                                      return 1;
                             default:abort ();
                    }
     
     
     
     
     
    	if ((ivalue) && (dvalue))
    ....

    ça fait plaisir !

    je vais potasser la bibliothèque C Gnu, c'est plein de trésors !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 13/09/2011, 10h08
  2. Est ce que ce code peut être amélioré ?
    Par _s4z_ dans le forum Langage
    Réponses: 3
    Dernier message: 04/09/2010, 12h51
  3. [Toutes versions] Peut on améliorer ce code
    Par johannj dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/04/2009, 14h09
  4. [E-07]Peut-on améliorer ce code?
    Par rvtoulon dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/03/2009, 16h48
  5. [Optimisation]Peut-on améliorer ce code ?
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 09/08/2007, 15h43

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