Parameter definierung der main Funktion, ein Zeichen zählen
-
Argc schrieb:
Ein Versuch noch:
int i=0; while(argv[i]) { cout << argv[i++] << endl; }Das kann funktionieren, jedoch sollte man dies niemals machen!
Die Console packt jedes element (getrennt durch ein,) in ein char array (jedes ist genau 255 groß, deshalb auch *?). An argc übergibt die Console die Anzahl der Elemente, sprich die anzahl der verwendeten char arrays.
Der Grund für das ganze: Arrays kann man nicht zählen. Aber warum ist das so? Oder warum wird einfach nicht der ganze übergabeparamter in einen einzigen char array gespeichert? Was war da der Hintergedanke bei der Console?
-
Belli schrieb:
Nimm erst mal Deine Tabletten und komm dann noch mal wieder.
Nimm Du erst einmal Deine, bevor Du mir blöd kommst!
-
Windows, Danke für den Thread. Habe mich köstlich amüsiert!
Viel Glück noch mit deinen 1-Dimensionalen Chars!
-
Willmeehhhr schrieb:
Windows, Danke für den Thread. Habe mich köstlich amüsiert!
Viel Glück noch mit deinen 1-Dimensionalen Chars!Ja danke!
-
Kann es vielleicht sein, dass da einfach nur absolutes Basiswissen über das Speichermanagement fehlt?
Wenn man in C oder C++ ein Array auf dem Speicher anlegt, dann wird wirklich nur die Anzahl Elemente im Speicher reserviert. Eine Länge wird nirgendwo abgespeichert. Wenn ich also das folgende mache:char** arr = new char*[10];Dann habe hier ein Array mit 10 Elementen im Speicher.
arrist einfach nur ein Zeiger auf diesen Speicherblock. Es ist ein Wert, welcher aussagt, wo man diesen Block im Speicher finden kann. Es wird aber nirgends gespeichert, dass es 10 Zeiger sind. Man weiss nur, dassarrein Zeiger auf einen Speicherblock ist. Über die Grösse ist nichts bekannt. Wir haben hier nur die Garantie, dass er Platz für 10 Zeiger hat, können dies aber nicht überprüfen. So funktioniert halt eben das Speichermangement in C und C++. Man will damit jeglichen Overhead eliminieren. Falls man die Grösse speichern möchte, dann kann man dies gerne tun, es ist aber kein Zwang vorhanden. In anderen Sprachen wird die Grösse jeweils gleich auch gespeichert, wodurch allerdings eben ein Overhead vorhanden ist.argvist eben nur ein Zeiger auf einen Speicherblock, welcher Zeiger beinhaltet. Wir wissen noch, dass jeder Zeiger im Speicherblock, auf den argv zeigt, auf einen nullterminierten String zeigt. Was grundsätzlich wieder ein Speicherblock ohne Grössenangabe ist, nur dass im letzten Element eine 0 steht. Mehr wissen wir überargvnicht.
Um nun zu wissen, wieviele Elemente im Speicherblock sind, auf welchenargvzeigt, brauchen wir die Angabe vonargc. So wird das halt in C und C++ gehandhabt. Und dies wird eben so gemacht, um Overhead zu vermeiden und dem Programmierer die Kontrolle über das Speichermanagement zu geben. Wenn er die Grösse speichern möchte, dann muss er dies eben separat tun. Wie es auch bei dermaingemacht wird, mit dem zusätzlichen Argumentargc.Grüssli
-
Die Arguments Eingabe in der Console ist sowieso berenzt auf maximal zwei Zeilen. Zumindest bei Windows. Also was will man davon ausgehen, dass es sein kann das man ein Dimensionale array mit einer größe von 1000 machen muss, wenn man eh nicht so viel Zeichen eingeben kann? hahahahahahahahahahaha
-
Man kann char* Arrays auch für andere Dinge als Konsoleneingaben verwenden.
-
Braunstein schrieb:
Man kann char* Arrays auch für andere Dinge als Konsoleneingaben verwenden.
Klar z.B. intern als Übergabe von einer Funktion zur anderen.
-
Hallo @Windows,
du sprichst immer von der "Console". Diese hat aber nichts mit der Aufsplittung der Parameter in das argv-Array zu tun. Die Konsole führt einfach die Anwendung (exe) aus und übergibt die gesamten Parameter als einen String an das Programm. Erst in der Runtime-Library-Funktion von C bzw. C++ (quasi eine "pre_main") wird die Aufsplittung vorgenommen und dann der main-Funktion als zwei Parameter übergeben (bzw. es ist sogar noch vom Standard erlaubt einen dritten "Environment"-Parameter zu übergeben).
Es stimmt, daß das argv-Array immer um eins größer als 'argv' ist und der letzte Parameter immer NULL (0) ist. Der argv-Parameter wird aber gesondert übertragen, damit man als Programmierer ganz einfach die Anzahl abfragen kann (ohne selber das Array durchiterieren zu müssen). Wie schon so oft hier geschrieben, ist es im allgemeinen bei der Übergabe eines Arrays nicht möglich, die Größe abzufragen bzw. zu bestimmen.
Die Entwickler von C bzw. C++ waren aber so schlau, beide Varianten zuzulassen!Unter Windows kann man sich den gesamten Parameterstring mittels der GetCommandLine-Funktion holen: http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx
Und hier noch genaueres zum Startup-Code für C bzw. C++ unter Windows: http://msdn.microsoft.com/en-us/library/17w5ykft(v=VS.85).aspxSo ich hoffe, ich habe noch mehr für Verwirrung hier gesorgt

-

Aber ich bin ja der ober Idiot!
-
Windows schrieb:

Aber ich bin ja der ober Idiot!Eigentlich schon denn ich habe 70% deines Textes nicht verstehen können. Ich denke das ging vielen hier so.
-
Verständnisproblem schrieb:
Windows schrieb:

Aber ich bin ja der ober Idiot!Eigentlich schon denn ich habe 70% deines Textes nicht verstehen können. Ich denke das ging vielen hier so.
Hahahahahaahah ja aber wenn das ein Dimensionale Char dann durch char 13 getrennt ist dann ist es nun mal so das es 5 Byte belegt. Hast du den Text von Th nicht gelesen oder wie? Und dann muss ich das mit der Funktion kürzen und wieder aufrufen. Ist doch logisch oder?
-
Da noch keiner auf die Idee gekommen ist, schreibe ich dir mal den folgenden Tipp:
Bitte lies das Kapitel "Argumente an die Hauptfunktion".
Edith schimpft: Hättest du "main() argc argv" in google.de eingegeben, wäre der obige Link gleich der _erste_ Treffer gewesen!

Auch sehr gut ist die Erklärung der TU-Chemnitz zu C. Da wird auch dein 1- zu zwei-dimensionales Verständnisproblem (hoffentlich) behoben.
Edith möchte noch schnell anmerken: Bevor du auf komische Ideen kommst, "
char *argv[]" und "char **argv" sind das Selbe!