Parameter definierung der main Funktion, ein Zeichen zählen



  • Belli schrieb:

    Ja, Du hast in diesem Fall ja auch den Spezialfall, daß in Deinem char - Array ein C-String liegt. Ein C-String ist per Definition Nullterminiert.

    Nachtrag:

    char c_string[100];
    
    strcpy(c_string, "hallo");
    

    1. Wieviel Elemente hat denn jetzt das Array?
    2. Wie stellst Du diese Anzahl in einer Funktion fest, der ich dieses Array übergebe?



  • Also die Console übergibt einfach ein riesiges Array an argv? Warum denn das? Warum übergibt es nicht einfach ein Array was so groß ist wie die anzahld er Elemente? Komischer Consolen Erfinder!



  • Die Konsole übergibt ein Array von char - Zeigern und die Anzahl der übergebenen char - Zeiger. Jeder der übergebenen char - Zeiger zeigt auf ein Array von chars, das mit einem 0 - Zeichen beendet wird.

    Wer hat was von 'riesig' geschrieben?



  • Belli schrieb:

    Die Konsole übergibt ein Array von char - Zeigern und die Anzahl der übergebenen char - Zeiger. Jeder der übergebenen char - Zeiger zeigt auf ein Array von chars, das mit einem 0 - Zeichen beendet wird.

    Wer hat was von 'riesig' geschrieben?

    ich habe was von Riesig geeschrieben.
    So nach dem wie man es mir erklärt hat braucht man den argc um wissen zu können wie viele felder von dem argv benutzt werden. Da man aber normalerweise auch arrays zählen kann, gehe ich davon aus das die Console mehr felder übergibt als gefült sind und mit hilfe des argc dann weis wie viele gefült sind. Anders ergibt es mir logisch einfach keinen sinn.



  • Wie weiter oben ausgeführt wurde, kann man Arrays nicht zählen.


  • Mod

    Windows schrieb:

    Anders ergibt es mir logisch einfach keinen sinn.

    Ich habe eine logische Erklärung für dich, die alle Beobachtungen erklärt: Du hast keine Ahnung, merkst es selber nicht, hältst dafür aber andere Leute für dumm, weil sie Sachen machen die du nicht verstehst.

    Du musst immer noch diese Frage beantworten:

    int zaehle_elemente(char array[])
    {
      // Wieviele Elemente hat array?
    }
    

    Ich verabschiede mich erstmal aus der Diskussion. Du bist entweder ein Troll oder lernresistent, es hat keinen Sinn dir weiter zu helfen. Zumal du keinerlei Eigeninitiative zeigst, dabei aber schon drei Seiten Erklärungen zu einem absolut simplen Thema bekommen hast, welches in jedem Tutorial erklärt wird.



  • Ein Versuch noch:

    int i=0;
    while(argv[i])
    {
    	cout << argv[i++] << endl;
    }
    

    Das kann funktionieren, jedoch sollte man dies niemals machen!



  • Okay, dies ist ein Spezialfall, denn argv[argc]=0



  • SeppJ schrieb:

    Windows schrieb:

    Anders ergibt es mir logisch einfach keinen sinn.

    Ich habe eine logische Erklärung für dich, die alle Beobachtungen erklärt: Du hast keine Ahnung, merkst es selber nicht, hältst dafür aber andere Leute für dumm, weil sie Sachen machen die du nicht verstehst.

    Du musst immer noch diese Frage beantworten:

    int zaehle_elemente(char array[])
    {
      // Wieviele Elemente hat array?
    }
    

    Ich verabschiede mich erstmal aus der Diskussion. Du bist entweder ein Troll oder lernresistent, es hat keinen Sinn dir weiter zu helfen. Zumal du keinerlei Eigeninitiative zeigst, dabei aber schon drei Seiten Erklärungen zu einem absolut simplen Thema bekommen hast, welches in jedem Tutorial erklärt wird.

    Sehr schlau. Genau ich habe keine Ahnung und nun? Ich weis es du weißt den Ursprungsgrund selber nicht dafür und kann es mir daher nicht erklären. Nun ist aber schluss hier mit dem Gezülse! Menschliche Sprache ist abschaum. Macht wohl doch mehr sinn selber in den tiefen der Bits nach den Grund zu suchen. Uni-Abschaum-Schüler. Hilfe mein Land ist Pleite!!!



  • Nimm erst mal Deine Tabletten und komm dann noch mal wieder.



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


  • Administrator

    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. arr ist 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, dass arr ein 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.

    argv ist 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 über argv nicht.
    Um nun zu wissen, wieviele Elemente im Speicherblock sind, auf welchen argv zeigt, brauchen wir die Angabe von argc . 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 der main gemacht wird, mit dem zusätzlichen Argument argc .

    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).aspx

    So ich hoffe, ich habe noch mehr für Verwirrung hier gesorgt 😉



  • 😃
    Aber ich bin ja der ober Idiot!


Anmelden zum Antworten