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 :

Getopt et ses valeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Getopt et ses valeurs
    Bonjour tout le monde
    J'ai un petit ennui avec getopt... J'essaye de recuperer plusieurs valeurs pour une option mais apparement les options suivantes ne sont plus prises en compte...

    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
     
      while ((c = getopt(argc, argv, "p:x:y:c:t:vn::" )) != EOF)
      {
          if (c == 'p')
        env.port  = atoi(optarg);
          else if (c == 'x')
        env.map_x = atoi(optarg);
          else if (c == 'y')
        env.map_y = atoi(optarg);
          else if (c == 'c')
        env.max_players = atoi(optarg);
          else if (c == 't')
        env.cronos = atoi(optarg);
          else if (c == 'v')
        env.verbose = 1;
          else if (c == 'n')
        {
          env.teams = xmalloc(3 * sizeof(*env.teams));
          env.teams[2] = "\0";
          env.teams[0] = strdup(optarg);
          optarg += (strlen(env.teams[0]) + 1);
          env.teams[1] = strdup(optarg);
        }
      }
    et je lance cette commande :
    ./serveur -p 39115 -x 666 -y 69 -v-n LoL Ookay -t 4242 -c 11

    Le resultat :

    map_x : 666
    map_y : 69
    port : 39115
    Team 1 : LoL
    Team 2 : Ookay
    verbose : 1
    max_players : 0
    cronos : 0

    En fait le getopt ignore toutes les options passees apres...


    Quelqu'un aurait il une petite idee ? Merci d'avance !

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Le format de description donne a getopt() n'est pas correct pour l'option -n. Contrairement a l'intuition, un double : ne signifie pas 'deux options suivent', mais que l'option est de la forme -n<first> <second>, sans espace entre -n et <first>.
    Ceci fonctionne (j'ai rajoute une troisieme option a -n pour montrer la bonne utilisation):
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
      int c;
     
      while ((c = getopt(argc, argv, "p:x:y:c:t:vn:01" )) != EOF)
      {
        printf("%c: ", c);
        fflush(stdout);
     
        switch (c)
        {
          case 'p':
            printf("port = %d\n", atoi(optarg));
            break;
          case 'x':
            printf("map_x = %d\n", atoi(optarg));
            break;
          case 'y':
            printf("map_y = %d\n", atoi(optarg));
            break;
          case 'c':
            printf("max_players = %d\n", atoi(optarg));
            break;
          case 't':
            printf("cronos = %d\n", atoi(optarg));
            break;
          case 'v':
            printf("verbose switched on\n");
            break;
          case 'n':
            {
              char *p = optarg;
     
              printf("%s ", p);
              p += strlen(p) + 1;
              printf("%s ", p);
              p += strlen(p) + 1;
              printf("%s\n", p);
            }
            break;
        }
      }
     
      return 0;
    }
    Si j'appelle le programme ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto -p 39115 -x 666 -y 69 -v -n team1 team2 team3 -t 4242 -c 11
    j'obtiens bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    p: port = 39115
    x: map_x = 666
    y: map_y = 69
    v: verbose switched on
    n: team1 team2 team3
    t: cronos = 4242
    c: max_players = 11
    Derniere remarque: la fonction atoi() est desormais remplacee par strtol(). Aucun nouveau code ne doit utiliser atoi().

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta reponse
    Cependant...

    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
    while ((c = getopt(argc, argv, "p:x:y:c:t:vn:0")) != EOF)
      {
          if (c == 'p')
        env->port  = atoi(optarg);
          else if (c == 'x')
        env->map_x = atoi(optarg);
          else if (c == 'y')
        env->map_y = atoi(optarg);
          else if (c == 'c')
        env->max_players = atoi(optarg);
          else if (c == 't')
        env->cronos = atoi(optarg);
          else if (c == 'v')
        env->verbose = 1;
          else if (c == 'n')
        {
          char *p = optarg;
     
          env->teams = xmalloc(3 * sizeof(*env->teams), env);
          env->teams[0] = strdup(p);
          p += strlen(p) + 1;
          env->teams[1] = strdup(p);
          env->teams[2] = "\0";
        }
      }
    Si je lance de cette maniere :
    ./serveur -p 39115 -n LoL Okket -x 22 -y 11 -v -t 100 -c 10

    le programme reste bloque en boucle infinie...

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tu declares bien c comme etant un int? Si tu le declares comme char, c ne pourra jamais etre egal a EOF...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui c'est bien un int ... En fait tant que le nom des equipes est passe en tan que dernier parametre, tout va bien ! Des qu'il est passe en premier ou autre parametre, le programme se bloque

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Je ne vois pas. L'erreur doit se produire ailleurs ou alors ton getopt() a un comportement inattendu, mais ce serait vraiment surprenant...

Discussions similaires

  1. trier un HasMap par ses valeurs.
    Par techz dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/08/2009, 18h58
  2. Réponses: 4
    Dernier message: 05/06/2009, 10h40
  3. Réponses: 2
    Dernier message: 01/05/2009, 09h59
  4. [PHP 5.0] Tri/Affichage d'un tableau à partir d'une de ses valeurs
    Par Wearmoi dans le forum Langage
    Réponses: 1
    Dernier message: 31/03/2009, 16h34
  5. DataTable et ses valeurs
    Par gabdeschenes dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/03/2009, 15h47

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