www.mikrocontroller.net

Forum: PC-Programmierung C environment


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
int main()
int main(int argc)
int main(int argc, char ** argv)

Diese Varianten gibt es.

Aufrufzeile "progname 1 2 3"

Wie sieht argv nun intern im Speicher aus?

argv     -> "progname"
argv + 1 -> "1"
argv + 2 -> "2"
argv + 3 -> "3"
argv + 4 -> ??? 0 oder keine 0

while((char *msg = argv++))
    std::cout << msg << std::endl;

andererseits, wenn das so wäre, dann bräuchte man argc Zähler nicht.

Ich finde nicht ob C Standard dazu Stellung bezieht.

Gruss

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> Wie sieht argv nun intern im Speicher aus?
>
> argv     -> "progname"
> argv + 1 -> "1"
> argv + 2 -> "2"
> argv + 3 -> "3"
> argv + 4 -> ??? 0 oder keine 0

0

>
> while((char *msg = argv++))
>     std::cout << msg << std::endl;
>
> andererseits, wenn das so wäre, dann bräuchte man argc Zähler nicht.

argc ermöglicht dir auch die alternative Form zu benutzen
    for( i = 0; i < argc; ++i )
      mach_was_mit( argv[i] );

Das ist das eine. Das andere ist, dass dir argc eine schnelle Prüfung 
ermöglicht, ob genug Parameter angegeben wurden, bzw. darauf zu 
reagieren.
int main( int argc, char* argv[] )
{
  if( argc == 1 ) {
    printf( "Not enough parameters\n" );
    showHelp();
    return EXIT_FAILURE;
  }

  ...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meines Wissens gehört argv[4] nicht mehr zum Standard, sondern ist
(wenn es zu 0 gesetzt ist) ein Goodie des Compilers.
Als legalen Weg kenne ich nur, auf argv[0] bis argv[argc-1]
zuzugreifen.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus dem Standard:

  5.1.2.2.1 Program startup
  ...
  If they are declared, the parameters to the main function shall obey
  the following constraints:

  — The value of argc shall be nonnegative.

  — argv[argc] shall be a null pointer.
  ...

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
— argv[argc] shall be a null pointer.

Danke.
Ich hatte irgendwie einen segfault gehabt. Und jetzt wieder nicht.

Oben hatte ich einen Fehler drin.
So muss es sein.
char * msg;
while((msg = *argv++))
    std::cout << msg << std::endl;

Wenn die 0 vorgeschrieben ist, dann braucht man auf argc gar
nicht zurückzugreifen.

Gruss, Daniel

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yalu schrieb:
> Aus dem Standard:
>
>   5.1.2.2.1 Program startup
>   ...
>   If they are declared, the parameters to the main function shall obey
>   the following constraints:
>
>   — The value of argc shall be nonnegative.
>
>   — argv[argc] shall be a null pointer.
>   ...

Das ist C99?

Dann stellt sich die Frage, wer von welchem Standard redet.
Das ist halt das schöne an Standards...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das ist C99?

Ja, war aber schon immer so in C.

> Dann stellt sich die Frage, wer von welchem Standard redet.
> Das ist halt das schöne an Standards...

C99 ist aber kein Standard, sondern eine Norm.
(Im Gegensatz zu C89 übrigens)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> Hallo,
>
>
> int main()
> int main(int argc)
> int main(int argc, char ** argv)
> 

Das Environment als dritten Parameter:
int main (int argc, char * argv[], char * envp)

Geht aber möglicherweise nur mit GNU-C

Johann

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Variante mit dem Environment-Pointer kennt auch Microsoft.
(VS2008, "echtes" C/C++)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der DOS-Welt zumindest gibt es die env-Geschichte schon lange,
ich kann mich noch dunkel an Turbo-C++ 1.01 erinnern von 1990.

Im damaligen ANSI-C war es aber m.W. nicht vorgesehen, also
nicht portabel.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>— argv[argc] shall be a null pointer.

Man beachte das "shall" -> Weiche Anforderung. muß nicht erfüllt werden

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> int main()
> int main(int argc)

Diese Variante ist nicht vorgeschrieben, aber auch nicht verboten.

> int main(int argc, char ** argv)

> Das Environment als dritten Parameter:
>
> int main (int argc, char * argv[], char * envp)
>
> Geht aber möglicherweise nur mit GNU-C

Die ist nach ISO C ebenfalls nicht vorgesehen, aber auch nicht verboten.


>>— argv[argc] shall be a null pointer.
>
> Man beachte das "shall" -> Weiche Anforderung. muß nicht erfüllt
> werden

Unsinn.  Da steht "shall", nicht "should".
Davon abgesehen ist der Begriff "shall" in der ISO-Norm ebenfalls 
definiert:

In this International Standard, ‘‘shall’’ is to be interpreted as a 
requirement on an implementation or on a program; conversely, ‘‘shall
not’’ is to be interpreted as a prohibition.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.