Main parameter Hilfe



  • Hallo,

    Da ich ja auch kein C++ pro bin, und mich noch damit beschäftige, frage ich mich was das mit den start paramtern auf sich hat (int argc, char **argv) oder das lezte als array.

    Kann mir das mal einer erklären, anhand eines beispeils?
    sry für sone noob frage, aber jeder fängt mal an oder ?

    mfg

    Kai



  • Damit kannst du dem Programm input liefern. Wenn du ein Tool hast, das Dateien kopiert, könntest du so spiezifizieren, welche Datei du kopieren willst und wie die Kopie heißen soll.

    argc beinhaltet die Zahl der Argumente ("argument count"), argv die Argumente sebst ("argument values").

    Beispiel:

    "meinTollesTool xyz abc 3.14"

    ->

    argc = 3
    argv[0] = "xyz"
    argv[1] = "abc"
    argv[2] = "3.14"



  • Klar.

    Die Parameter der main -Funktion geben Zugriff auf die Kommandozeilenparameter, von denen du sicher schon gehört hast. Das ist der offizielle Weg, auf sie in einem C++-Programm zuzugreifen.

    Die Namen der Parameter sind dabei nach Konvention argc und argv genannt.
    Hier mal der Standard dazu:

    [basic.start.main]/2 schrieb:

    [...] argc shall be the number of arguments passed to the program from the environment in which the program is run.
    If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings and argv[0] shall be the pointer to the initial character of a ntmbs that represents the name used to invoke the program or "". The value of argc shall be non-negative. The value of argv[argc] shall be 0 [...]

    argv ist also - wenn man so will - ein Array von Zeichenketten, dass argc nullterminierte Strings enthält.
    Und argv[0] enthält meistens den Pfad zu der ausführbaren Datei die das Programm enthält, bzw. "Den Namen der benutzt wurde um das Programm zu starten". Oder einen leeren String.

    Beispiel. Dieses Programm gibt alle Kommandozeilenparameter aus:

    #include <iostream>
    
    int main(int argc, char* argv[])
    {
        for( int ct = 0; ct < argc; ++ct )
            std::cout << argv[ct] << '\n';
    }
    

    Edit: Ahh, der Trick mit dem Inkrement funktioniert nicht, da das hier nur ein doppel-Zeiger ist... 💡



  • argv[0] = "xyz"
    argv[1] = "abc"
    argv[2] = "3.14"

    Falsch. Lies meinen Post. 😉



  • ahh okay, ja habe es mal getestet, und ja das erste ist der pfad ok 🙂

    aber wie macht man das mit anderen datein?
    Ich muss sagen, das finde ich schon bissel kompliziert, aber so 40% verstehe ich davon 🙂

    Gibs ein beispiel anhand mit einer datei? die ich im prog.. benutze über die parameter?

    Weil mir fält nix dazu ein, warum man es gebrauchen könnte z-b für was es sinn macht.

    Aber thx schonmal für die beispiele 🙂

    Das ding ist, wo ich danach geguckt habe, habe ich den sinn nicht verstanden bzw die logik, ja der pfad des prog.. und nun?
    Das ist was ich net begrweife, aber für was das ist, habe ich verstanden, bloß umsetzen = 0, da ich die logik net verstehe.



  • Abgesehen von ein paar Freaks (90% der Nutzer dieses Forums) benutzt niemand mehr eine Kommandozeile, aber die hatte mal einen Sinn.
    Stell dir vor du schreibst ein Programm zum komprimieren und dekomprimieren wie WinZip. Dann gibt es zwei Befehle (zum tippen in die Kommandozeile), zip und unzip. Da aber die Funktionen zum Komprimieren und Dekomprimieren zusammen gehören schreibst du sie in ein Programm. Wenn das Programm gestartet wird muss es herausfinden was es eigentlich tun soll. Also kuckt es auf den ersten Parameter. "zip". Aha, komprimieren wollen wir. Was eigentlich? Kuck auf den zweiten Parameter. "bla.txt". Aha. Öffne Datei bla.txt und komprimiere sie. Und nun? Kuck auf dritten Parameter "bla.zip". Aha, tu das Resultat in bla.zip. Das ist wirklich so üblich, dass zip und unzip einfach nur Links auf ein und dasselbe zip-Programm sind und der erste Parameter (argv[0]) entscheidend ist.
    Das wurde alles inzwischen durch Klickibunti-GUIs abgelöst, aber funktioniert im Prinzip immer noch.



  • nwp3 schrieb:

    Abgesehen von ein paar Freaks (90% der Nutzer dieses Forums) benutzt niemand mehr eine Kommandozeile, aber die hatte mal einen Sinn.
    ...
    Das wurde alles inzwischen durch Klickibunti-GUIs abgelöst, aber funktioniert im Prinzip immer noch.

    Kommandozeilen-Parameter unterstützt nahezu jedes seriöse Programm, um u.a. Eigenschaften zum Programmstart zu setzen oder von anderen Programmen einfach ausgeführt werden zu können.
    GUIs sind schön, erfordern allerdings Eingabemethoden, die andere Programme unschön simulieren müssten. Manche Spiele zeigen eine Kommandokonsole auch nur, wenn das Spiel mit dem entsprechenden Aufrufparameter gestartet wurde.
    usw.

    b4nan1 schrieb:

    Gibs ein beispiel anhand mit einer datei? die ich im prog.. benutze über die parameter?

    Du kannst über die Parameter auch Dateinamen bekommen und dann...? Was du danach machen willst, liegt bei dir. Mit den Dateinamen kannst du die Dateien an einen unbekannten Ort verschieben und den gutgläubigen Nutzer zum Weinen bringen :p



  • nwp3 schrieb:

    Abgesehen von ein paar Freaks (90% der Nutzer dieses Forums) benutzt niemand mehr eine Kommandozeile

    Auch GUI Programme werten Kommandozeilenparameter aus. Wenn man Expolorer auf eine Datei doppelklickt, wird der Pfad auf dieselbe Weise an das verknüpfte Programm übergeben.



  • ahh okay ihr seit die besten thx 🙂
    Habe es soweit verstanden ok, aber wie man damit arbeitet ist für mich noch nicht klar, aber das prinzip ist logisch ja 🙂

    PS: Brauchen werde ich es sicherlich net, aber man kann nicht genung lernen in C/C++ wenn man damit mal angefangen hat 🙂

    Mein Simulator den ich schreibe (Game) umfasst schon 2000 zeilen code, und da dachte frage ich mal nach den parameter nach, die ich schon oft gesehen habe xDD

    thx nochmal^^


Log in to reply