Anfänger Frage zu c++



  • Der Standard verbietet 'void main()' nicht explizit, aber ein standardkonformer Compiler darf bei 'void main()' undefiniertes verhalten an den Tag legen.

    Da steht aber auch das, und da mein Compiler nicht dagegen hat darf ichs ja benutzen oder?



  • ched schrieb:

    ...aber ein standardkonformer Compiler darf bei 'void main()' undefiniertes verhalten an den Tag legen.

    Du willst doch aber sicher, das dein Code auch auf anderen Compilern einwandfrei läuft oder?? Darum schreib einfach die "feinere" Variante 😃



  • es sollte immer int main (...) heißen

    und das Programm sollte mit return 0 beendet werden wenn es fehlerfrei war und !=0 wenn es fehler hatte.

    Damit kann man in Scriptsprachen (WSH, Batch, perl, phyton, ruby) oder beim Aufruf dieses Programmes aus einem anderen heraus auf Fehler reagieren. 😃



  • float berechnekegelvolumen (float r, float h) 
    { 
    const float PI=3.14f; 
    float g=PI*r*r; 
    float volumen=(g*h)/3; 
    };
    

    Also, wenn da ein Wert zurückgegeben werden soll, würde ich vielleicht mal 'return volumen;' in die letzte Zeile der Funktion schreiben.



  • Macht des keinen Unterschied ob ich void main(void) oder int mein () schreib??
    Und was kommt in die klammer??



  • 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.


Anmelden zum Antworten