C und Argumente unter Linux (argp)



  • Hi Leute,

    Kann mir vielleicht jemand bei einem Problemchen helfen? Also, ich habe ein Beispielcode über die Kommandozeilenauswertung in der PC!Linux 02/2003 gesehen und wollte es mal ausprobieren, ob es so einfach geht, und es ging nicht so einfach!
    Erstmal gibt mir KDevelop 2.1.3einige Warnungen in form von:
    warning: missing initializer for member argp_option::group' warning: missing initializer for memberargp_option::key'
    warning: missing initializer for member argp_option::arg' warning: missing initializer for memberargp_option::flags'
    warning: missing initializer for member `argp_option::doc'
    kann jemand was damit anfangen? Falls ihr den kompletten Code braucht, sagt bescheid!

    Danke, schonmal!



  • code wäre schon mal nicht schlecht, damit man genaueres sagen kann 😉



  • const char *argp_program_version="0.1";
    const char *argp_program_bug_address="<muster@muster.net>";
    
    static char doc[]="Argp2 - Demo fuer argp";
    
    /* Angabe der Argumente, die Akzeptiert werden */
    static char args_doc[]="ARG1 ARG2";
    
    /* unterstützte Optionen */
    static struct argp_option options[]=
    {
      {"verbose", 'v', 0,     0,  "Detailiert Ausgabe"},
      {"quiet",   'q', 0,     0,  "keine Ausgaben"},
      {"silent",  's', 0,     OPTION_ALIAS},
      {"output",  'o', "FILE",0,  "Output to FILE instead of standard output"},
      {0}
    };
    
    /* Struktur zur Parameterübergabe */
    struct arguments
    {
      char *args[2];    /*ARG1 & ARG2 */
      int silent, verbose;
      char *output_file;
    };
    
    /* Parse-Funktion */
    static error_t parse_opt (int key, char *arg, struct argp_state *state)
    {
      struct arguments *arguments=state->input;
    
      switch(key)
      {
        case 'q': case 's':
          arguments->silent=1;
          break;
        case 'v':
          arguments->verbose=1;
          break;
        case 'o':
          arguments->output_file=arg;
          break;
    
        case ARGP_KEY_ARG:
          if(state->arg_num>=2)
            /* Zu viele Argumente */
            argp_usage(state);
    
          arguments->args[state->arg_num]=arg;
          break;
    
        case ARGP_KEY_END:
          if(state->arg_num<2)
            /* Zu wenig Argumente */
            argp_usage(state);
            break;
    
        default:
          return ARGP_ERR_UNKNOWN;
      }
      return 0;
    }
    
    /* Our argp parser. */
    static struct argp argp={options, parse_opt, args_doc, doc};
    
    int main(int argc, char **argv)
    {
      struct arguments arguments;
    
      /* Vorbelegen */
      arguments.silent=0;
      arguments.verbose=0;
      arguments.output_file="-";
    
      argp_parse(&argp, argc, argv, 0, 0, &arguments);
    
      return 0;
    }
    

    [edit]Code Tags korrigiert[/edit]



  • sorry, hab noch die include-dateien vergessen! 😉
    [cpp]
    #include <argp.h>
    #include <stdlib.h>
    [\cpp]

    Außerdem scheint irgendwie die Textformatierung nicht richtig zu funzen, oder?



  • Ringostarr schrieb:

    Außerdem scheint irgendwie die Textformatierung nicht richtig zu funzen, oder?

    Doch, du musst halt davor [ cpp ] und danach [ /cpp ] schreiben. Oder den Button anklicken.



  • Hi,

    ich hab das den Code mal als reinen c-code und nicht c++-code unter KDevelop kompilieren lassen, und da funktioniert es ohne jegliche Warnungen oder Fehlermeldungen! Aber wie bekomme ich das ganze in c++-code einwandfrei zum laufen, weil ja mein restlicher code schon in c++ geschrieben ist und ich jetzt halt Argumente mit verarbeiten wollte?!



  • Naja, ist 'ne blöde Warnung vom g++, dass nicht alle Member des structs initalisiert wurden.

    Wenn dich das stört könntest du das Warnlevel runterschrauben oder den code ändern:

    static struct argp_option options[]= 
    { 
      {"verbose", 'v', 0,     0,  "Detailiert Ausgabe"}, 
      {"quiet",   'q', 0,     0,  "keine Ausgaben"}, 
      {"silent",  's', 0,     OPTION_ALIAS}, 
      {"output",  'o', "FILE",0,  "Output to FILE instead of standard output"}, 
      {0, 0, 0, 0, 0}
    };
    


  • Danke erstmal für die hilfe, jetzt sind schon einige Warnungen weniger drin! Mir wäre es lieber, den code zu ändern, statt die Warnlevel runterzuschrauben!
    nachdem ich die initialisierung von '{0}' auf '{0, 0, 0, 0, 0, 0}' umgestellt habe gibt er statt den folgenden Zeilen,

    main.cpp:37: warning: missing initializer for member `argp_option::group'
    main.cpp:37: warning: missing initializer for member `argp_option::group'
    main.cpp:37: warning: missing initializer for member `argp_option::doc'
    main.cpp:37: warning: missing initializer for member `argp_option::group'
    main.cpp:37: warning: missing initializer for member `argp_option::group'
    main.cpp:37: warning: missing initializer for member `argp_option::group'
    main.cpp:37: warning: missing initializer for member `argp_option::group'
    main.cpp:37: warning: missing initializer for member `argp_option::key'
    main.cpp:37: warning: missing initializer for member `argp_option::arg'
    main.cpp:37: warning: missing initializer for member `argp_option::flags'
    main.cpp:37: warning: missing initializer for member `argp_option::doc'
    main.cpp:37: warning: missing initializer for member `argp_option::group'
    

    nur noch

    main.cpp:37: warning: missing initializer for member `argp_option::group' 
    main.cpp:37: warning: missing initializer for member `argp_option::group' 
    main.cpp:37: warning: missing initializer for member `argp_option::doc' 
    main.cpp:37: warning: missing initializer for member `argp_option::group' 
    main.cpp:37: warning: missing initializer for member `argp_option::group'
    

    aus, wie bekomme ich jetzt noch den eine doc- und die group-members weg? Mit noch mehr 0-initialisierungen gehen die nicht weg!

    Dann gibt er noch eine weitere Warnung zu folgender Programmzeile aus!

    struct arguments *arguments=state->input;
    

    Warnung:

    main.cpp: In function `error_t parse_opt(int, char*, argp_state*)':
    main.cpp:50: warning: invalid conversion from `void*' to `arguments*'
    

    könntet ihr mir da auch weiterhelfen? Danke!



  • Ringostarr schrieb:

    Mir wäre es lieber, den code zu ändern, statt die Warnlevel runterzuschrauben!

    Ja, mir auch, aber in diesem Fall sind die Warnungen vom gcc halt Mist. Haben mich auch schon oft genervt. Offenbar kann man die nicht ausstellen (höchstens -W weglassen, was wiederum zuviel des guten wäre).

    wie bekomme ich jetzt noch den eine doc- und die group-members weg? Mit noch mehr 0-initialisierungen gehen die nicht weg!

    Doch, da fehlt noch ein doc für 'silent'.
    Ausserdem hat ein Blick in /usr/include/argp.h ergeben, dass die Structur nach 'doc' noch eine 6. Variable 'group' hat.

    {"verbose", 'v', 0,     0,  "Detailiert Ausgabe", 0}, 
    ...
    


  • Fetten dank erstmal.
    Aber in die argp.h hätte ich auch selbst mal reingucken können 😉
    hättest vielleicht noch ne lösung für die letzte warnung?



  • Kann mir denn keiner mehr helfen?
    solange er diese letzte Fehlermeldung noch anzeigt, kann ich nicht weiterprogrammieren!
    hier nochmal die Fehlermeldung:

    main.cpp: In function `error_t parse_opt(int, char*, argp_state*)': 
    main.cpp:50: warning: invalid conversion from `void*' to `arguments*'
    

    dabei handelt es sich um folgende codezeile

    static error_t parse_opt (int key, char *arg, struct argp_state *state) 
    { 
      struct arguments *arguments=state->input; // <--
      ...
    }
    

    ich nehme an, das es wieder was mit der argp.h zu tun hat!



  • Ringostarr schrieb:

    struct arguments *arguments=state->input; // <--
    

    Bei C++ musst du casten..
    sofern state->input denn richtig ist:

    arguments *arguments= (struct arguments*)state->input;
    


  • Danke für den Ratschlag, jetzt kann er es ohne fehlermeldungen kompilieren.
    Jetzt gibt es allerdings ein weiteres Problem, und zwar folgendes.
    Ich kann es kompilieren ohne eine Fehlermeldung, aber wenn ich das Programm ausführen will, dann zeigt er nur 'Speicherzugriffsfehler' an und das wars!
    das hat er aber die ersten beiden male nicht gemacht, wo ich das kompiliert und ausgeführt habe! Aber jetzt macht er immer diesen Fehler, am programm kanns eigentlich nicht liegen, ich schätze eher, dass es irgendwas mit linux und der Speicherverwaltung zu tun hat. Ein neustart des Rechners bringt auch keine abhilfe!
    Könnte mir vielleicht auch jemand bei diesem Problem helfen??? 🙂



  • Danke für den Ratschlag, jetzt kann er es ohne fehlermeldungen kompilieren.
    Jetzt gibt es allerdings ein weiteres Problem, und zwar folgendes.
    Ich kann es kompilieren ohne eine Fehlermeldung, aber wenn ich das Programm ausführen will, dann zeigt er nur 'Speicherzugriffsfehler' an und das wars!
    das hat er aber die ersten beiden male nicht gemacht, wo ich das kompiliert und ausgeführt habe! Aber jetzt macht er immer diesen Fehler, am programm kanns eigentlich nicht liegen, ich schätze eher, dass es irgendwas mit linux und der Speicherverwaltung zu tun hat. Ein neustart des Rechners bringt auch keine abhilfe!
    Könnte mir vielleicht auch jemand bei diesem Problem helfen??? 🙂



  • Danke für den Ratschlag, jetzt kann er es ohne fehlermeldungen kompilieren.
    Jetzt gibt es allerdings ein weiteres Problem, und zwar folgendes.
    Ich kann es kompilieren ohne eine Fehlermeldung, aber wenn ich das Programm ausführen will, dann zeigt er nur 'Speicherzugriffsfehler' an und das wars!
    das hat er aber die ersten beiden male nicht gemacht, wo ich das kompiliert und ausgeführt habe! Aber jetzt macht er immer diesen Fehler, am programm kanns eigentlich nicht liegen, ich schätze eher, dass es irgendwas mit linux und der Speicherverwaltung zu tun hat. Ein neustart des Rechners bringt auch keine abhilfe!
    Könnte mir vielleicht auch jemand bei diesem Problem helfen??? 🙂


Anmelden zum Antworten