Seite 1 von 1

Einfach Argumentverarbeitung unter Windows!

Verfasst: So Sep 13, 2009 10:19 am
von fat-lobyte
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

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: So Sep 13, 2009 11:40 am
von Xin
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.

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: So Sep 13, 2009 12:59 pm
von cloidnerux

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;
}

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: So Sep 13, 2009 2:27 pm
von fat-lobyte
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? ;-)

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: So Sep 13, 2009 7:14 pm
von Kerli
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...

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: Mo Sep 14, 2009 10:13 am
von sonic
Warum nicht boost::program_options verwenden?
Klick

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: Mo Sep 14, 2009 11:13 am
von Kerli
sonic hat geschrieben:Warum nicht boost::program_options verwenden?
Klick
Sag ich doch :P (Schau doch einmal einen Beitrag ober dir ;) )

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: Mo Sep 14, 2009 12:19 pm
von sonic
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

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: Mo Sep 14, 2009 6:40 pm
von fat-lobyte
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.

Re: Einfach Argumentverarbeitung unter Windows!

Verfasst: Mo Sep 14, 2009 8:12 pm
von Kerli
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...