Hallo, ich habe c++ porgramm entwickelt, dass ich jetzt mit Hilfe von Parametern aus der Console aus aufrufen möchte. also z.B.: "myprog.exe -reset" Dann soll der reset ausgeführt werden und vieles mehr. Da es hier mindestens 15 fälle gibt wollte ich das mit einer Switch case realisieren, dass will aber nicht funktionieren. Hat jmd. eine sinnvolle Idee, wie ich das realisieren kann. Switch case kann nur char oder int. Also habe ich versucht das zu mappen, aber das hat nicht richtig funktioniert. Des weiteren bin ich auch getopt gestoßen, aber das bekomme ich iwie nicht richtig zum laufen (windows). Hat jmd. eine Idee? Hat jmd. schonmal ein ähnliches problem gehabt? Ich hab also mehrere Anstäze und keiner hat auf Anhieb funktionier ;) Jetzt wollte ich mich erstmal umhören, bevor ich mich auf einen festlege. Vielen dank für die Ideen schonmal. Grüße tom
Tom A. schrieb: > Hat jmd. eine sinnvolle Idee, wie ich das realisieren kann.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Genau darum habe ich nach einer sinnvollen Idee gefragt ;) Stell dir das jetzt 15 mal vor... Das ist nicht sonderlich schön ^^ Bin für weitere Ideen noch offen :D
Gast
#2000913
Dann gib uns bitte mehr Informationen. Was ist eine "schöne" Löaung, eine "sinnvolle"? Das sind abstrakte Eigenschaften die jeder anders objektiviert.
Es kann ja nicht sein, dass ich 15 IF abfragen hintereinander machen muss oder liege ich da falsch? Bei fast bei jedem Befehl in der cmd gibt es die Parameter, welche einfach angehängt werden. Ich dachte eben, dafür gibt es eine Art Standard wie das im allgemeinen gelöst wird. Würdet ihr das etwa mit IF-ELSE lösen?
Mach dir ein Array, wo du alle "Vergleichsstrings" ablegst und mach vor dem Switch ein strcmp und werte die Zahl aus. Also etwa so
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
Gast
#2000948
Ich würde getopt nehmen.
Gast
#2000949
Tom A. schrieb: > Es kann ja nicht sein, dass ich 15 IF abfragen hintereinander machen > muss oder liege ich da falsch? was glaubst du denn wie ein switch case funktioniert? (Es wird nich immer mit Sprungtabelle gearbeitet!)
Geht natürlich auch so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
Hi, mit den Posts hat es sich gerade ein wenig überschlagen. Ich hab mich jetzt für die Lösung von Timmo entschieden, die ist meiner Meinung nach sehr elegant ;) Hab noch kurz eine schleife drumherum gebaut und ZACK kann man alle Eingabeparameter auswerten. Vielen Dank nochmal, an alle die sich hier so schnell und fleißig gemeldet haben. Hier das Resultat:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
Gast
#2001077
Ich würde eine Klasse dazu erstellen. Für jeden Parameter instanzierst du diese Klasse und übergibst ihr die Kommandozeile und den Parameter den du haben willst. Nun baust du noch eine Funktion ein die prüft ob der Parameter gesetzt wurde, dieser gibt halt true oder false zurück, je nachdem ob der Parameter in der übergebenen Liste ist oder nicht. z.b. hab ich eine Klasse generiert die "clpar" heisst. Als Konstruktor nimmt sie argc, argv und den Parameter (in echt noch mehr). Dann gibts noch ne Funktion namens isSet() (auch hier natürlich noch andere). Also z.B.:
1 | |
2 | |
3 | |
4 | |
Das war jetzt natürlich nur so grob die Vorgehensweise. Damit hat man ne schöne Kapselung vom Rest des Projektes und kann die Klasse immer schön wiederverwenden. Ich hab z.B. noch so Sachen wie Argumente für Parameter und deren Prüfung mittels Regex eingebaut.
Gast
#2001082
Ich würde mich nach getopt umschauen. Oder die Parameter sortieren und mit bsearch() arbeiten. Alternativ kann man in der Suchtabelle prima Callbacks hinterlegen oder Zeiger auf Flaggen und so weiter.
oder xgetopt
Gast
#2001160
Ich würde sogar sagen, man könnte getopt nehmen.
Gast
#2001180
Tom A. schrieb: > Ich hab mich > jetzt für die Lösung von Timmo entschieden, die ist meiner Meinung nach > sehr elegant ;) Dann mach es so, ich finde es nicht sehr schön, da man ein aussagekräftigen string Vergleich durch eine Zahl ersetzt wird. Ein paar else if Anweisungen finde ich persönlich schöner, die muss man dann noch nicht mal mehr kommentieren, da der Inhalt schon der Kommentar ist. und wie schon gesagt bist du nicht der erste der das Problem hatte -> getopt
Was in C++ auch geht, ist eine std::map< std::string, void(*)() > meinemap; oder so ähnlich, also eine Map, die Strings auf Funktionen mappt. Dann geht die Auswahl mit einem schnöden meinemap[meinstring]() oder ggf. analog mit Parametern oder Funktionsobjekten statt Funktionen, falls man richtig schick programmieren will.
Tom A. schrieb: > Würdet ihr das etwa mit IF-ELSE lösen? Kommt drauf an. Wenn das alles ist, was ausgewertet werden muss: Ja, warum nicht? 15 sind doch nicht viel. Das ist einfach, schnell geschrieben, leicht zu durchschauen, leicht zu erweitern (im Falle eines Falles). Der Lösung krampfhaft einen switch-case über den Umweg eines Indizes einzuführen, kann ich zb überhaupt nichts abgewinnen. Da ist die eigentlich wichtige Information, nämlich welches Codestück zu welchem Paramater gehört über einen nicht unerkleckliches Stück Code verschmiert. Um zu wissen, wann genau der case mit der Nummer 13 ausgeführt wird, muss ich Wörter in einem Array abzählen. Da schau ich lieber auf das if am Anfang des Abschnitts, denn dort steht im Klartext, wie die Option lautet. Denn: kürzer ist diese 'Index in Array suchen und darauf ausbauen switchen' Lösung in Wirklichkeit auch nicht. Sie verschleiert nur ein wenig mehr, was da eigentlich passiert. Aber seis drum. Irgendwann wirst auch du merken, dass die vermeintliche Tipparbeit das kleinste aller Probleme ist. Code schreibt man nur einmal (ok, manchmal wird er noch korrigiert), aber man liest ihn viele male. Da schreib ich mir den Code lieber so, dass ich beim Lesen nicht vielen Querverweisen folgen und ständig rauf/runter scrollen muss um die Details zu sehen.
Ok, das mit der switch case, das sehe ich nun auch ein ist Käse ;) da man später wirklich nicht mehr durch ... Ich werde mir jetzt mal das mappen von Funktionen anschauen und mal schauen ob das eine gute Lösung für mich ist. Die if else Lösung finde ich nach wie vor noch nicht soooo tolle ;) Danke für die Ideen. Grüße Tom
Ok, also ich werde es jetzt mal mit einer map realisieren, wenn mich dann nochmal etwas stören sollte, werde ich es über den haufen werfen ;) Die Lösung sieht jetzt so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
Vielen dank für die Inspiration ;) Grüße Tom
Tom A. schrieb: > Die if else Lösung finde ich nach wie vor noch nicht soooo tolle Macht auch nicht das was du jetzt programmiert hast, den auf diese Weise werden alle Übergebenen Befehle ausgewertet, bei der else/if Lösung jedoch höchstens einer...
Klaus Wachtler schrieb: > Was in C++ auch geht, ist eine > std::map< std::string, void(*)() > meinemap; > oder so ähnlich, also eine Map, die Strings auf Funktionen mappt. > Dann geht die Auswahl mit einem schnöden meinemap[meinstring]() Nein, denn das hätte böse Folgen, wenn jemand einen Paramter übergibt, den das Programm nicht kennt. Tom hat das mit der Benutzung von find() schon richtig gemacht.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.