Anfänger Frage zu c++



  • in die klammern kommen die parameter ...
    zum übernehmen oder sonstwas :D.
    kann dir bestimmt ein anderer besser erklären, draum lass ich es lieber 😛



  • in die Klammern kommen 2 sachen (siehe unten) die parameter vom programmaufruf aufnehmen können. Sie müssen aber nicht zwingend dort stehen und sind am besten wegzulassen, wenn due sie eh nicht brauchst.

    int main (int argc, char** argv)
    

    argc enthält die anzahl der parameter
    *argv zeigt auf die parameter

    die erste Zeichenkette enthält den Programmnamen (inkl. Pfad), alle weiteren die übergebenen Parameter, wobei nach jedem "<leerzeichen>" in einem neuen index gespeichert wird.



  • #include <iostream>
    #include <conio.h>
    int main( int argc, char *argv[] )
    {
      for( int i=0; i<=argc; ++i)
      { 
        std::cout << i << ": " << argv[i] << std::endl;
      }
      getch();
      return 0;
    }
    

    Eingabe:
    main arg1 arg2

    Ausgabe:
    0: main
    1: arg1
    2: arg2
    3:

    siehe auch http://www-home.fh-konstanz.de/~drachen/prog/Teil-4.pdf



  • Erhard Henkes schrieb:

    Eingabe:
    main arg1 arg2

    Ausgabe:
    0: main
    1: arg1
    2: arg2
    3:

    Punkt 0 stimmt definitiv nicht! argv[0] enthält den kompletten pfad zum programm! (getestet mit VC++ 6.0)



  • THE_FreaK schrieb:

    Punkt 0 stimmt definitiv nicht! argv[0] enthält den kompletten pfad zum programm! (getestet mit VC++ 6.0)

    *g* nur weils der VC++6 so macht, ist es noch lange nicht standard.

    darf ich zitieren:

    [...] argv[0] shall be the pointer to the initial character of a NTMBS that represents the name used to invoke the program or ""

    NTMBS: null-terminated multi-byte string
    also auf deutsch: char*

    es ist also vollkommen korrekt, wenn in argv[0] nur "main" steht.



  • Da muss man vorsichtig sein innerhalb der Visual C Umgebung , also beim Debuggen ist alles dabei, auf der Kommandozeile nicht unbedingt.

    z.b. ruft der Debugger das programm immer inclusive der extension "exe" auf. Dies passiert auf der Kommandozeile selten.

    Deshalb sollte man an dieser Stelle vorsichtig sein wen mann argv[0] benutzen will.
    (leidvolle Erfahrung)



  • argv[0] zu benutzen ist nicht sinnvoll moeglich, da es ja auch " " sein kann...

    wofuer argv[0] gut ist, habe ich noch nicht entdeckt - da es ja keine festgeschriebene form hat. das einzige was man damit machen kann ist 1) loggen wie es aufgerufen wurde oder 2) sich selbst nochmal starten.



  • Wann ist arg[0] leer?

    Soweit ich weis ist definiert das der Name des aufrufenden Programms drinstehen soll.
    Was leider nicht definiert ist, wie er dort steht mit Pfad, ohne Pfad, mit extension, ohne extension.

    Bei alle C-Programmen die ich bisher bearbeitet habe war er nie NULL.
    Wir nutzen den namen tatsächlich zum loggen. In der Protokolldatei wird argv[0]....argv[n] protokolliert.
    Bei Windowsprogrammen, die haben bei uns alle den Microsoft Versionrecord wird aus argv[0] der
    komplette Programmname erzeugt und damit der Versionsrecord gelesen und im logfile protokolliert.

    💡 Deshalb bitte mich nicht erschrecken das argv[0] leer sein kann oder beweisen. 💡

    Bitte um Antwort 🙂



  • Shade Of Mine schrieb:

    *g* nur weils der VC++6 so macht, ist es noch lange nicht standard.

    ok, seh ich ein ^^
    Grade weils MS ist sollte man ja eigentlich einiges erwarten *roleeyes*
    Aber man lernt eben immer dazu 😃

    @PAD
    Naja, scheint ja nun leider compiler abhängig zu sein, also solang ihr immer den selben kompiler nutzt wirds nit schief gehen.



  • @THE_FreaK schrieb:

    Naja, scheint ja nun leider compiler abhängig zu sein, also solang ihr immer den selben kompiler nutzt wirds nit schief gehen.

    Ich glaube das ist nicht Compilerabhängig sondern Betriebssystem

    Das Wind... Enviromnent kann den Programmnamen liefern, somit dürfte argc[0] nicht leer sein.



  • argv[0] shall be the pointer to the initial character of a NTMBS that represents the name used to invoke the program or "".

    aus 3.6.1.2 Main function ISO/IEC 14882:1998

    argv[0] ist sehr nützlich, wenn man eine Parameter Liste angibt

    if(argc!=MINDEST_ANZAHL_AN_ARGUMENTEN) {
      std::cerr << "usage: " << argv[0] << " argumente" << std::endl;
      return 1;
    }
    


  • <offtopic>

    PAD schrieb:

    Bei alle C-Programmen die ich bisher bearbeitet habe war er nie NULL.

    Dass der Zeiger mit Null verglichen werden kann und dass dieser Vergleich true liefert, das ist recht häufig. Das kannst Du sogar selbst ausprobieren, indem Du main rekursiv, mit den passenden Parametern, aufrufst (Das ist nur in C legal).

    💡 Deshalb bitte mich nicht erschrecken das argv[0] leer sein kann oder beweisen. 💡

    <erschreck&beweis> </>



  • @PAD aber rein theoretisch währe es doch auch legal, wenn der compiler so arbeitet, das der vom OS übergebene Parameter nicht in argv landet, sondern einfach verworfen wird und somit argv[0] == "" gesetzt wird.
    Soweit ich das rauslesen konnte gibt es für argv[0] kein eindeuig vorgeschriebenes verhalten. Oder seh ich das falsch?



  • @Daniel E.
    Dies ist sicher eine zulässige Lösung. Ich meine aber den 08/15 Normalfall das das Programm vom OS aus aufgerufen wird und cih zu ersten Mal main betrete.

    Ich interpretiere da den Standard etwas anders.

    In meinem Standard Programming Language - C 14.12.1989 (wahrscheinlich veraltet)
    2.1.2.2.1 Zeile 12 If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. ...

    Ich beziehe hier environment auf das OS falls es das kann so muss der name da drin stehen.

    Da ich teilweise auch im embedded Bereich arbeite habe ich dort C-Compiler ohne OS, da ist er dann tatsächlich NULL.

    @kingruedi Wo kommt dein Zitat her? C Standard C++ Standard kanst du bitte die Information nachliefern.
    Wie geht es nach dem '"",' weiter

    Danke



  • argv[0] zu benutzen ist nicht sinnvoll moeglich, da es ja auch " " sein kann...

    Das ist mir aber egal, da ich weiß, für welche Platform ich entwickle und welche Compiler hauptsächlich darauf eingesetzt werden und deren Verhalten kenne.



  • PAD schrieb:

    Ich interpretiere da den Standard etwas anders.

    In meinem Standard Programming Language - C 14.12.1989 (wahrscheinlich veraltet)
    2.1.2.2.1 Zeile 12 If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. ...

    Stimmt, das steht heute immer noch drin. Du hast also recht. Mir ist allerdings noch nicht ganz klar, ob sich das nur auf den 'Program startup' bezieht, oder ob es eine für main allgemeingültige Aussage ist ... ein Aufruf von main ist doch 'eigentlich' ein ganz normaler Funktionsaufruf. Oder etwa nicht? Jedenfalls sind wir hier hoffnungslos off topic, außerdem interessiert es vermutlich außer uns sowieso niemandem. Von miraus können wir aber per Strompost oder so weiterdiskutieren.



  • offtopic is ok. Die anderen haben sich auch abgemeldet. In meienr Umgebung weis ich wies läuft.

    Danke für die Diskussion 😃 42 and thanks for the fish 😃



  • PAD schrieb:

    Wo kommt dein Zitat her? C Standard C++ Standard kanst du bitte die Information nachliefern. Wie geht es nach dem '"",' weiter

    steht doch unter dem Zitat

    kingruedi schrieb:

    aus 3.6.1.2 Main function ISO/IEC 14882:1998

    das ist der ISO C++ Standard von 1998 (gibt ja nur einen bisher ;))

    aber irgend wie ist das Zitat eh nicht komplett. Ich komm irgend wie nicht ganz klar mit XPDF 😞

    naja, hier ist es nochmal

    int main(int argc, char* argv[]) { /* ... */ }
    In the latter form 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 (NTMBSs)
    (17.3.2.1.3.2) 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 nonnegative. The value of
    argv[argc] shall be 0. [Note: it is recommended that any further (optional) parameters be added after
    argv. ]

    aus 3.6.1.2 Main Function aus ISO/IEC 14882:1998 (ISO C++ 1998 Standard)

    also argv[0] kann NULL sein (wenn argc=0)



  • Sorry wußte nicht das 14882 der C++ Standard ist.

    Der Text hätte ja auch aus einem neueren C-Standard sein können.

    Leider ist mit dieser Definition das Loch offen, das das OS den Namen des Programms nicht liefern muß, es kann ja prinzipiell immer "" einsetzen.

    Das war in dem alten C-Standard IMHO besser definiert.

    Aber das amcht noch nicht einma MS$

    und auch gut das im neuen Standard eindeutig der Prototyp mit int main(...
    definiert ist



  • \aleph_0 schrieb:

    chedd schrieb:

    allerdings endet das prog dann bevor es das ergebnis ausgegeben hat (oder zumindest bevor man das Ergebnis lesen kann)

    Füge das am Ende von main() hinzu:

    cin.clear();
        cin.ignore(cin.rdbuf()->in_avail());
        cin.get();
    

    Wenn ich das einfüg funktioniert das zwar, aber irgentwie stört mich des.
    Jedes mal was einfügen zu müssen von dem ich net mal weis was es heisst *g*.

    Warum muss ich das immer reinmachen, und bei den ganzen Tutorials ist das nie drin und trotzdem funktionierts anscheinend bei allen auser mir die den Tut lesen........... 😡


Anmelden zum Antworten