C und Argumente unter Linux (argp)
-
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???