1

Voilà, j'ai dû par la force des choses me remettre au C, et comme mon programme (en CLI) a besoin d'arguments, je me suis dit que j'allais faire les choses bien et passer par la fonction getopt_long qui fait justement ça smile
Pour commencer, j'ai naturellement pris l'exemple fourni
while (1)
         {
           static struct option long_options[] =
             {
               /* These options set a flag. */
               {"verbose", no_argument,       &verbose_flag, 1},
               {"brief",   no_argument,       &verbose_flag, 0},
               /* These options don't set a flag.
                  We distinguish them by their indices. */
               {"add",     no_argument,       0, 'a'},
               {"append",  no_argument,       0, 'b'},
               {"delete",  required_argument, 0, 'd'},
               {"create",  required_argument, 0, 'c'},
               {"file",    required_argument, 0, 'f'},
               {0, 0, 0, 0}
             };
           /* getopt_long stores the option index here. */
           int option_index = 0;
           c = getopt_long (argc, argv, "abc:d:f:", long_options, &option_index);
           /* Detect the end of the options. */
           if (c == -1)
             break;
         }

Manque de pot, ça ne compile pas...
J'ai vite trouvé qu'en changeant long_options[] par *long_options, ça compilait mieux, mais ce n'est pas encore ça :
statistic.c:849: warning: braces around scalar initializer
statistic.c:849: warning: (near initialization for ‘long_options’)
statistic.c:849: warning: initialization from incompatible pointer type
statistic.c:849: warning: excess elements in scalar initializer
statistic.c:849: warning: (near initialization for ‘long_options’)
statistic.c:849: warning: excess elements in scalar initializer
statistic.c:849: warning: (near initialization for ‘long_options’)
statistic.c:849: warning: excess elements in scalar initializer
statistic.c:849: warning: (near initialization for ‘long_options’)

Et ça, pour chaque ligne du tableau long_opts tsss Il n'y a pas un moyen d'avoir un truc qui marche vraiment ? (j'ai essayé un certain nombre de trucs, mais rien ne passait... et je ne suis pas un dieu des structures en C trinon )

avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

2

C'est bon avec le [] normalement. Quel compilateur utilises-tu pour que ça ne compile pas? Ces exemples sont testés avec GCC, évidemment.

Sinon, il y a toujours la bonne vieille méthode:
  if (!strcmp("-h", cur_arg) || !strcmp("--help", cur_arg)) {
    print_help();
  } else if ...

utilisée dans à peu près tous les composants de TIGCC (sauf GCC/Binutils). grin (D'ailleurs, j'ai converti certains de getopt à ça parce que c'est plus portable, sans devoir copier-coller le code de getopt partout où ce n'est pas dans la libc système.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

je pencil kevin, utiliser getopt est une horreur et vive faire un parseur a la main (surtout que c'est plutot simple.)

ie :

   /* Now we use a real argument parser ! */
   for(i = 1 ; (i < argc) && (argv[i][0]=='-'); i++)
   {
      switch(argv[i][1])
      {
         default: /* Option not recognized */
         case 'h': /* ask for help */
            printUsage(argc, argv);
            break;
            
         case 'p': 
            if (atoi(argv[i+1]) != 0)
            {
               printf("-Load plugin #%d...\n", atoi(argv[i+1]));
               if ( plugin_load(atoi(argv[i+1])) == -1)
               {
                  plugin_list();
                  exit(0);
               }
               i++;
            }
            else
            {
               plugin_list();
               exit(0);
            }
            break;
            
            case 'f':
            printf("-Start with fds!\n");
            START_WITH_FDS = 1;
            break;
            
            case 'd':
            printf("-Start with debug!\n");
            START_DEBUG = 1;
            break;
            
            case 'b':
            printf("-Palette file is %s\n", argv[i+1]);
            PALETTE_FILENAME = argv[i+1];
            i++;
            break;      
      }
      
   }


Bref franchement pour 3 arguments 1/2 pas besoin de sortir une usine a gaz comme peut l'être getopt (et non portable de surcroît...)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

4

Bref, le truc censé remplacer du code chiant et pas propre arrive à être pire, si j'ai bien compris ?
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

5

Ben comme tu le disais si bien dans un autre topic assez vieux, le C n'est pas génial des qu'il s'agit de sortir de la libc standard...

Surtout avec des lib comme ça qui sont limite GCC centric et qui passe pas/mal sur du VisualC++ ou autres
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

6

Kevin Kofler (./2) :
C'est bon avec le [] normalement. Quel compilateur utilises-tu pour que ça ne compile pas? Ces exemples sont testés avec GCC, évidemment.

gcc version 4.3.2
Sinon, il y a toujours la bonne vieille méthode:
  if (!strcmp("-h", cur_arg) || !strcmp("--help", cur_arg)) {
    print_help();
  } else if ...

utilisée dans à peu près tous les composants de TIGCC (sauf GCC/Binutils). grin (D'ailleurs, j'ai converti certains de getopt à ça parce que c'est plus portable, sans devoir copier-coller le code de getopt partout où ce n'est pas dans la libc système.)

Oui, mais c'est moche et ça n'est pas standard (et ça ne va pas permettre les raccourcis permis par la libopt)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

7

C'est quoi ton message d'erreur?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

Je n'ai pas dit qu'il y avait une erreur, j'ai dit que ce n'était pas encore ça wink et ce sont tous les warnings postés dans le ./1
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

9

Flanker (./1) :
Manque de pot, ça ne compile pas... J'ai vite trouvé qu'en changeant long_options[] par *long_options, ça compilait mieux

=> Je demande les messages d'erreur quand tu utilises l'exemple tel quel.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

c'est couillon, mais moi je sortirais la déclaration du bloc while, pour la mettre en variable globale-fichier (avec static)

11

./1: J'ai essayé l'exemple dans le lien avec GCC 3.2, GCC 3.3, GCC 3.4, GCC 4.0, GCC 4.1, GCC 4.2, GCC 4.3, llvm-gcc, ICC 10.1 et -O2 -Wall -W -ansi -pedantic -std=c99
Aucun warning ni erreur... (A part ICC sur un truc complètement normal de syntaxe K&R)
Quelle version de glibc ?
fichier /usr/include/features.h __GLIBC__ et _GLIBC_MINOR_

12

je n'arrive plus à retrouver l'erreur sad
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

13

<troll>
Tu as probablement fait un rebuild all entre temps. Avec ça, les outils libres finissent par comprendre qu'en fait, il y avait pas d'erreur.
</troll>
Tout ce qui passe pas par le port 80, c'est de la triche.

14

Kevin Kofler (./9) :
Flanker (./1) :
Manque de pot, ça ne compile pas... J'ai vite trouvé qu'en changeant long_options[] par *long_options, ça compilait mieux

=> Je demande les messages d'erreur quand tu utilises l'exemple tel quel.

Vu la "correction" de l'erreur, je dirais qu'il avait une erreur "type incomplet" sur la structure option...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.