Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Argumente an die Main-Funktion übergeben!?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.07.2006, 20:56 Uhr
~Special_Unit
Gast


Hallo erstmal!
Also ich bin Neuling, deshalb diese Frage .. Ich habe folgendes Programm in einem Buch gefunden:


Code:
#include <iostream.h>


void main(int argc, char* argv[])
{
    cout << argc << '\n';

    for(int i=0;i<argc;i++)
    {
        cout << argv[i] << '\n';
    }
}



Jetzt ist mir folgendes nicht klar:

1. Auch wenn ich dem Parameter "argc" kein Argument übergebe, gibt er die korrekte Anzahl der Argumente aus...warum?

2. Warum ist der zweite Parameter ein Zeiger? Warum ist es nicht ein ganz normaler String?

Ich wäre dankbar für Antworten!
Danke im Voraus!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.07.2006, 21:55 Uhr
Pler
Einer von Vielen
(Operator)


1. argc ist die Anzahl der Arguments
2. argv ist ein Zeiger-Zeiger. Dh. Array von Zeichenketten.

Das Betriebssystem stellt dir das zur Verfügung.
Bsp.:

Bash:

./programm eins zwei drei



Dein Programm gibt aus:

Bash:

3
./programm
eins
zwei
drei


Die 4 Zeichketten sind eben in einen Array von Zeichenketten gehalten.

Aber ich gehe jede Wette ein, dass das ein deinem Buch dabei steht.

Dieser Post wurde am 22.07.2006 um 21:55 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.07.2006, 23:01 Uhr
~Special_Unit
Gast


Ja, was argc ist, weiß ich, aber meine Frage war, warum argc auch die richtige Anzahl von Argumenten ausgibt auch wenn ich argc selbst kein Argument übergebe, sondern nur argv.
Und was sind Zeiger-Zeiger?

PS: Nein, in meinem Buch steht es leider nicht so drin.
Es steht nur drin, was das Programm macht, aber nicht warum es dies tut.

Ich hoffe auf weitere Antworten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.07.2006, 23:18 Uhr
Pler
Einer von Vielen
(Operator)



Zitat:

warum argc auch die richtige Anzahl von Argumenten ausgibt [...]


Na weil dein Betriebssystem dafür sorgt.
Du kannst argc überhaupt nicht übergeben.


Zitat:

auch wenn ich argc selbst kein Argument übergebe, sondern nur argv.


Wie? Du übergibst das?
Zeig mal wie du das machst.

Dieser Post wurde am 22.07.2006 um 23:18 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.07.2006, 23:27 Uhr
~Special_Unit
Gast


?? Indem ich argv irgendeinen String übergebe?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.07.2006, 23:31 Uhr
Hans
Library Walker
(Operator)



Zitat von ~Special_Unit:
Ja, was argc ist, weiß ich, aber meine Frage war, warum argc auch die richtige Anzahl von Argumenten ausgibt auch wenn ich argc selbst kein Argument übergebe, sondern nur argv.

Du kannst an argc selbst keine Argumente übergeben. In argc stellt Dir das Betriebssystem die Information zur Verfügung, wieviele Parameter an das Programm übergeben wurden. An die Parameter selbst kommst Du über argv dran.

Zitat:

Und was sind Zeiger-Zeiger?


Die Deklaration

C++:
char *argv[];


bzw.

C++:
char* argv[];


bedeutet, das argv ein Zeigerarray ist, also ein array aus Zeigern, die auf weitere Zeiger verweisen. Der zweite Zeiger verweist auf den String, d.h. die Zeichenkette, die an das Programm übergeben wurde.


Zitat:

PS: Nein, in meinem Buch steht es leider nicht so drin.
Es steht nur drin, was das Programm macht, aber nicht warum es dies tut.

Ich hoffe auf weitere Antworten.

Dieses Programm, oder eine Variante davon steht aber meisst in fortgeschritteneren Kapiteln, die das wissen aus den vorherigen voraus setzen. Deshalb wird auch nicht auf jedes Detail eingegangen, sondern nur der Zusammenhang erklärt. Die wesentlichen Dinge hier vorausgesetzt werden, sind Zeiger und die Parameterübergabe an Funktionen, die zwei grosse Kapitel des Buches umfassen sollten, die vorher behandelt werden.
Ansonsten findest Du in den FAQs des Forums noch diesen Aufsatz dazu.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 22.07.2006 um 23:34 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.07.2006, 00:14 Uhr
Pler
Einer von Vielen
(Operator)



Zitat:

?? Indem ich argv irgendeinen String übergebe?


??

siehe Post von Hans.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.07.2006, 19:03 Uhr
~Special_Unit
Gast


Ah, ok, danke erstmal für die Antworten aber (ich weiß ich bin lästig ;D) ich verstehe trotzdem noch etwas nicht.

Warum kann man einem Element des Arrays einen ganzen String zuordnen? Ich dachte in einem char-Array darf man einem Element nur genau einen Buchstaben zuordnen, warum wird dem Element "i" nun in diesem Falle eine ganze Zeichenkette zugeordnet. Hat das auch wieder was mit den Zeigern zu tun?

PS: Auch die Kapitel mit Zeigern und Funktionen habe ich mir durchgelesen, doch die waren nicht so ausführlich... leider.

Ich bitte um weitere Antworten.
Danke im Voraus!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.07.2006, 20:14 Uhr
Pler
Einer von Vielen
(Operator)


Ja genau, das sind die Zeiger-Zeiger. Ein Array von Zeigen, die wieder jeweis auf den ersten Buchstaben jeder Zeichenkette zeigen.


Code:
argv      // Zeiger-Zeiger
argv[0]  // Element 0 enthält Zeiger auf das ersten Zeichen des ersten Strings
argv[1]  // Element 1 enthält Zeiger auf das erste Zeichen des zweiten Strings
argv[1][0] // Das erste Zeichen des zweiten Strings
argv[1][2] // Das dritte Zeichen des zweiten Strings
usw.

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.07.2006, 22:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
char i; // <- ein buchstabe
const char *j = "Hallo"; // <- Zeichenkette (in nem Konstanten abschnitt)
char k[6] = "Hallo"; // <- Zeichenkette (beschreibbar, auch einfach k[] = "Hallo" wäre möglich)
const char **l = {"Hallo" "Du"}; // Array von Zeigern auf (hier) konstante Zeichenketten.
char l[4][5];  // <- das hier wär (fast) das selbe, d.h 4 elemente für max 4elementige Zeichenketten (+ Null-Terminator)



den Speicher für argv legt dir jedoch das Betriebsystem an:

./programm a b c

Als Pseudocode macht das BS dann folgendes:

C++:
argc = (int)3;
argv = (char**){
  (char*){'.', '/', 'p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', '\0'},
  (char*){'a', '\0'},
  (char*){'b', '\0'},
  (char*){'c', '\0'},
  NULL };



das

{'a', '\0'} kann man in dem Fall auch "a" schreiben, wollte es nur der ausführlichkeit mal tun.

Achja, was evtl wichtig ist: die einzelnen Elemente müssen imho NICHT hintereinander im Speicher liegen, in argv selbst stehen ja nur die adressen:

argv[0] = 0x????????
argv[1] = 0x????????
argv[2] = 0x????????
argv[3] = 0x????????
argv[4] = 0x0000000 (oder je nachdem auf was NULL definiert ist)

die jeweiligen Adressen zeigen dann auf die Zeichenketten im Speicher.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: