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 :

C : utilisation de getopt - il boucle sans fin...


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 29
    Points : 25
    Points
    25
    Par défaut C : utilisation de getopt - il boucle sans fin...
    Bonjour,

    j'utilise getopt pour récupérer le soptions positionnées en argument de mon prog.

    je boucle sans fin sur le while. Pour info, je suis sur une plateforme Unix AIX.

    Voici le code concerné :
    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
    while((c = getopt(argc,argv,"FfMm?"))!=EOF) 
    { 
      switch(c) 
      { 
        case 'f': 
        case 'F': 
        case 'm': 
        case 'M': 
          printf("option %c\n",c); 
          break; 
        case '?': 
          printf("option %c\nargument %s\n",c,optarg); 
          break; 
      } 
    }
    Que je mette EOF comme test dans le while ou -1, le résultat est le même.

    Merci par avance de votre aide...

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    getopt retourne EOF dès qu'il a fini, donc n'utilise pas -1.

    Ensuite, est ce que tu passes les bons paramètres ?

    Si ça peut d'aider :

    http://man.developpez.com/man3/getopt.3.php

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    J'ai testé ton programme et ça marche chez moi... Par contre, en principe, c'est -1 qu'il faut tester...

    Ensuite j'ai pensé à une discussion pas trop lointaine avec Emmanuel et je me suis dit:

    "Tu fais un switch sur les caractères.... As-tu déclaré ta variable comme un caractère?"

    Parce que si t'es un peu comme moi, ton code entier serait:

    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
     
     
    int main()
    {
    char c;
     
    while((c = getopt(argc,argv,"FfMm?"))!=EOF)
     {
     switch(c)
      {
      case 'f':
      case 'F':
      case 'm':
      case 'M':
        printf("option %c\n",c);
        break;
      case '?':
        printf("option %c\nargument %s\n",c,optarg);
        break;
      }
     }
     
    return 1;
    }
    Et alors je me suis dis: "Est-ce ton char est signé ou non par défaut?" Parce que si je mets:

    Ca boucle aussi...

    Il faudrait mettre:

    Mais encore mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i;
    char c;
     
    while( (i = getopt(argc,argv,"FfMm?"))!=EOF) 
      {
      c = i;
      ...
    "A tribute to Emmanuel"


    Jc

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ahh la contradiction:

    Citation Envoyé par PRomu@ld
    getopt retourne EOF dès qu'il a fini, donc n'utilise pas -1.
    et

    Citation Envoyé par fearyourself
    Par contre, en principe, c'est -1 qu'il faut tester...
    Ca m'apprendra de lire le man anglais... C'est la première fois que je vois une différence flagrante entre les deux langues...

    Je suppose que EOF == -1 donc ce n'est pas grave, mais est-ce vrai sur tous les systèmes (j'ai appris à être méfiant ces derniers jours...)?

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Après une petite recherche, je suis tombé sur la même contradiction. Un man de linux en français donne EOF et le man de mon mac donne -1. Je suppose comme toi que EOF donne -1 mais j'ai un doute.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i;
    char c;
     
    while( (i = getopt(argc,argv,"FfMm?"))!=EOF) 
      {
      c = i;
      ...
    Pas la peine de faire si compliqué. getopt() retourne un int. c doit donc être de type int. point. De plus, c'est exactement le type attendu par switch()...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       int c;
     
       while ((c = getopt (argc,argv,"FfMm?")) != EOF) 
       {
          switch (c)
    <...>
    Toujours aller au plus simple. Le type 'naturel' pour un entier, c'est int. D'ailleurs c'est aussi le type d'une constante caractère : 'A' est de type int. (Tester un sizeof 'A' pour s'en convaincre)
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Sur ma Debian :
    VALEUR RENVOYÉE
    La fonction getopt() renvoie le caractère de l'option s'il en trouve une, « : » s'il
    manque un paramètre pour une option, « ? » s'il y a un caractère inconnu, et EOF (-1) à
    la fin de la liste des options.
    8) Ca met tout le monde d'accord 8)
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    merci à vous tous.

    chez moi ça marche aussi bien avec -1 que EOF, et l'erreur venait bien que par défaut mes 'char' sont unsigned.

    j'ai redéclarer ma variable 'c' en 'signed char', et ça ne boucle plus.

    Merci à vous tous pour vos répnses aussi rapide !!

  9. #9
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Sur le site de GNU, ils mettent aussi -1 comme valeur de retour au cas où il n'y a plus d'arguments.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fearyourself
    Je suppose que EOF == -1 donc ce n'est pas grave, mais est-ce vrai sur tous les systèmes (j'ai appris à être méfiant ces derniers jours...)?
    EOF est défini par le langage C comme un 'int < 0'. C'est tout.

    getopt() n'étant pas une fonction standard, on aura du mal à avoir une définition unique.

    Mais supposer que EOF vaut -1 est une erreur qui peut mener à des erreurs graves. Si la doc de getopt() dit 'la valeur retournée est -1'. C'est -1. Point. C'est pas EOF.

    Si elle dit 'c'est EOF', c'est EOF. Point. C'est pas -1. Il faut être cohérérent et ne pas faire de suppositions hasardeuses.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par moussmouss
    j'ai redéclarer ma variable 'c' en 'signed char', et ça ne boucle plus.
    Mauvais type. Il faut mettre 'int'.
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Pouic
    Sur ma Debian :
    VALEUR RENVOYÉE
    La fonction getopt() renvoie le caractère de l'option s'il en trouve une, « : » s'il
    manque un paramètre pour une option, « ? » s'il y a un caractère inconnu, et EOF (-1) à
    la fin de la liste des options.
    8) Ca met tout le monde d'accord 8)
    Non Ceci est peut être valable sur une implémentation donnée, mais peut être fausse ailleurs...

    Encore une fois, getopt() n'est pas une fonction standard C. Il ne faut pas s'attendre à des définitions cohérentes d'une plateforme à l'autre (à moins qu'elle soit POSIX, dans ce cas seule cette norme fait autorité...).
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Aparement, elle est bien POSIX (en tout cas à en croire le man de mon mac)

  14. #14
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Ouaip, elle est bien Posix.2 et elle doit rendre -1 :
    http://man.developpez.com/man3/getopt.3.php

    Citation Envoyé par IEEE
    The getopt() function shall return -1, rather than EOF, so that <stdio.h> is not required.
    Emmanuel>> Mon post était juste une blagounette, car mon man trouve le moyen de dire ``indifferemment'' EOF ou -1. Je sais bien que les manuels sont fortements dépendants de l'implantation (entre distribs, j'ai même déjà eu des surprises...)
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par IEEE
    The getopt() function shall return -1, rather than EOF, so that <stdio.h> is not required.
    Voilà. Ca, au moins, c'est clair.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/11/2009, 16h22
  2. ASCII, Clavier et boucle sans fin
    Par stozmen dans le forum C
    Réponses: 12
    Dernier message: 29/03/2007, 16h00
  3. [Débutant]Boucle sans fin : Wend non reconnu
    Par SebHoule dans le forum IHM
    Réponses: 5
    Dernier message: 12/06/2006, 16h49
  4. Boucle sans fin : danger pour le serveur ?
    Par Rémiz dans le forum Langage
    Réponses: 4
    Dernier message: 09/12/2005, 16h52
  5. [SQL SERVER 2000] Fonction utilisateur : boucle sans fin
    Par galinijay dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/09/2005, 16h03

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