Einfach Argumentverarbeitung unter Windows!

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Einfach Argumentverarbeitung unter Windows!

Beitrag von fat-lobyte » So Sep 13, 2009 10:19 am

Hallo Leute!

Hatte vor kurzem auf der Arbeit das Problem dass ich in einem Programm Kommandozeilenparameter einlesen musste - allerdings hatte ich keine lust auf das übliche if (!strcmp(argv, argz[d])) { printf("falsche option xyz"); } ...
Deswegen hab ich mich mal ein bisschen umgesehen und die nette getopt() funktion gefunden - allerdings nur auf Unix. Deswegen habe ich einen kleinen Artikel geschrieben wie man sich das ding auch auf Windows holt:

http://tutorial.proggen.org/doku.php?id ... pt-windows

Dazugepackt habe ich noch eine kleine Klasse, die einem die Argumentverwaltung ganz abnimmt. So einfach kann argumentverwaltung sein:

Code: Alles auswählen

#include <iostream>
 
#include "program_options.h"
 
int main(int argc, char* argv[])
{
    ProgramOptions op(argc, argv);
    if (!op)
    {
        std::cerr<<"Invalid usage!\n";
        return 1;
    }
 
    std::cout<<"We are treating the file \""<<op.filename<<"\"\n";
    std::cout<<"A is on: "<<op.a_flag<<'\n'; 
    std::cout<<"Some option is \""<<op.some_option<<"\"\n";
    std::cout<<"Another option is \""<<op.another_option<<"\"\n"; 
    return 0;
}
Seht sie euch an und seid inspiriert!

mfg, fat-lobyte
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von Xin » So Sep 13, 2009 11:40 am

Ich weiß, dass es einen GNU-Parser gibt, dem man angeben muss, was für ein Typ ein Paramter ist (einfach ein Keyword => Bool oder eine Zuweisung --bla=foobar) und dann kann man damit Variablen belegen.

Übertrieben toll fand ich das damals aber zugegebenermaßen nicht.
Ich parse meine Kommandozeilen selbst, was aber auch nicht übertrieben toll ist ;-) aber wenigstens keine Abhängigkeiten erzeugt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von cloidnerux » So Sep 13, 2009 12:59 pm

Code: Alles auswählen

op.filename
Ich nehme mal an, das es über eine Klasse nur möglich ist, nur Optinen einer festen Form zu nutzen, ungefär so:
meinProgramm - f filname -o option - o option2...
Wenn dies der fll wäre, wäre die Klasse nicht so mein fall.
Besser wäre es, wenn man über Templates jedes Elemnt abrufen könnte:

Code: Alles auswählen

string filename;
if(op.GetOption(&filename) == false)
{
   std::cerr << "Falsche Option" << std:::endl;
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von fat-lobyte » So Sep 13, 2009 2:27 pm

cloidnerux hat geschrieben:

Code: Alles auswählen

op.filename
Ich nehme mal an, das es über eine Klasse nur möglich ist, nur Optinen einer festen Form zu nutzen, ungefär so:
meinProgramm - f filname -o option - o option2...
Wenn dies der fll wäre, wäre die Klasse nicht so mein fall.
Besser wäre es, wenn man über Templates jedes Elemnt abrufen könnte:

Code: Alles auswählen

string filename;
if(op.GetOption(&filename) == false)
{
   std::cerr << "Falsche Option" << std:::endl;
}
Stimmt. Aber:
Wiki hat geschrieben:Diese Seite beschreibt einen Quick 'n' Dirty Hack,
Wenn man das richtig mit templates machen würde, wärs ja nicht mehr quick'n'dirty, oder? ;-)
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von Kerli » So Sep 13, 2009 7:14 pm

fat-lobyte hat geschrieben:Dazugepackt habe ich noch eine kleine Klasse, die einem die Argumentverwaltung ganz abnimmt. So einfach kann argumentverwaltung sein:
Naja, so einfach ist das auch wieder nicht. Du musst ja für unterschiedliche Argumente jedes Mal die Klasse ändern ;)
cloidnerux hat geschrieben:Besser wäre es, wenn man über Templates jedes Elemnt abrufen könnte:
Du kannst ja was in die Richtung schreiben :P

Wer aber was einfach und flexibel zu verwende Bibliothek will sollte sich einmal Boost.Program_options anschauen. Da kann man sogar automatisch eine Beschreibung aller Optionen ausgeben lassen oder die Einstellungen auch mit Einstellungen aus Konfigurationsdateien kombinieren lassen. Dabei werden die Typen der Parameter mit Templates festgelegt...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

sonic
Beiträge: 29
Registriert: Do Aug 13, 2009 6:58 pm

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von sonic » Mo Sep 14, 2009 10:13 am

Warum nicht boost::program_options verwenden?
Klick

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von Kerli » Mo Sep 14, 2009 11:13 am

sonic hat geschrieben:Warum nicht boost::program_options verwenden?
Klick
Sag ich doch :P (Schau doch einmal einen Beitrag ober dir ;) )
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

sonic
Beiträge: 29
Registriert: Do Aug 13, 2009 6:58 pm

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von sonic » Mo Sep 14, 2009 12:19 pm

Kerli hat geschrieben:
sonic hat geschrieben:Warum nicht boost::program_options verwenden?
Klick
Sag ich doch :P (Schau doch einmal einen Beitrag ober dir ;) )
Hab ich wohl übersehen :D

Greets
Tobi
Frei nach dem refrain für Let it be...

Write in C, Write in C,
Write in C, yeah, Write in C.
Only wimps use BASIC.
Write in C.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von fat-lobyte » Mo Sep 14, 2009 6:40 pm

sonic hat geschrieben:Warum nicht boost::program_options verwenden?
Klick
Weil
a) Boost.Program options = eine Abhängigkeit mehr
b) Komplizierter

Bei dieser Lösung schmeisst man einfach nur die Quellcodedateien rein und schon sollts gehen.
Aber ihr habt recht,
JA Es ist nicht konfigurierbar
JA Boost.ProgramOptions ist besser
JA Es ist nicht so toll

Sollte auch nur eine möglichkeit für kleine Programme sein. Wenn ich mal schnell ein kleines Test-C++ Programm zusammenhacke das Argumente nimmt, dann habe ich keine Lust noch Boost.Programoptions dazuzulinken.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Einfach Argumentverarbeitung unter Windows!

Beitrag von Kerli » Mo Sep 14, 2009 8:12 pm

fat-lobyte hat geschrieben:Bei dieser Lösung schmeisst man einfach nur die Quellcodedateien rein und schon sollts gehen.
Aber ihr habt recht,
JA Es ist nicht konfigurierbar
JA Boost.ProgramOptions ist besser
JA Es ist nicht so toll

Sollte auch nur eine möglichkeit für kleine Programme sein. Wenn ich mal schnell ein kleines Test-C++ Programm zusammenhacke das Argumente nimmt, dann habe ich keine Lust noch Boost.Programoptions dazuzulinken.
Ich würde die Parameter nur nicht als Member nehmen sondern zb ein std::map<std::string,std::string> nehmen. Dadurch brauchst du die Klasse dann nicht anpassen. Von std::string kann man dann ja sehr leicht nach allen Typen konvertieren. Dazu hab ich auch einmal eine einfache Klasse geschrieben.

Aber ansonsten ist boost.Program_Options auch nicht all zu schwer zu verwenden. Ich hab das gestern erstmals bei mir in einem Programm verwendet, und da ist es eigentlich ganz gut gegangen. Dort war das aber mit der Abhängigkeit nicht so schlimm, da ich sowieso schon ein paar Boost Bibliotheken eingebunden habe...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten