Parameter definierung der main Funktion, ein Zeichen zählen



  • SeppJ schrieb:

    Mach mal vor.

    Wenn man mit einem Element die zeichen vor einem "," meint, dann müsste man einfach nach dem "," suchen und bis dahin (minus 1 natürlich) abschneiden. Aber wahrscheinlich wird es die Console auch genauso machen. Zu managent einfach die Übergabe, abhängig von dem C String die der Mensch angibt.



  • Ein eindimensionales Array von char - Werten muß aber nicht zwangsläufig ein Komma enthalten. Es muß auch nicht zwangsläufig ein '\0' enthalten.
    Wie also soll man die Länge feststellen, wenn man keine Ahnung hat, welche Zeichen drin sind, bzw. welches Zeichen das letzte im Array ist?
    Das ist die Frage, die Dir SeppJ gestellt hat.



  • Belli schrieb:

    Ein eindimensionales Array von char - Werten muß aber nicht zwangsläufig ein Komma enthalten. Es muß auch nicht zwangsläufig ein '\0' enthalten.
    Wie also soll man die Länge feststellen, wenn man keine Ahnung hat, welche Zeichen drin sind, bzw. welches Zeichen das letzte im Array ist?
    Das ist die Frage, die Dir SeppJ gestellt hat.

    Also mal angenommen das Char (was durch die menschliche Eingabe über die Console resultiert) hat kein \0 (was ich nicht verstehe warum das so sein sollte?), wie soll dann die Console erkennen wo das ende ist? Also muss es ein \0 geben!



  • Argc schrieb:

    argv ist ein Feld von nullterminierten (w)chars.

    Du musst es dir folgendermaßen vorstellen, wie argv im Speicher liegt:

    Programmname\01.Paramter\02.Paramter\0 ab hier steht sonstwas im Speicher
    

    Wobei \0 die Escapesequenzen sind. D.h., du musst die Anzahl von argv kennen, um etwas sinnvolles damit anstellen zu können (siehe die vorigen Posts).



  • Argc schrieb:

    Argc schrieb:

    argv ist ein Feld von nullterminierten (w)chars.

    Du musst es dir folgendermaßen vorstellen, wie argv im Speicher liegt:

    Programmname\01.Paramter\02.Paramter\0 ab hier steht sonstwas im Speicher
    

    Wobei \0 die Escapesequenzen sind. D.h., du musst die Anzahl von argv kennen, um etwas sinnvolles damit anstellen zu können (siehe die vorigen Posts).

    Nach dem Beispiel zeigte aber argc die anzahl der Elemente (getrennt durch ,) und nicht die Anzahl der Felder des C String.



  • Windows schrieb:

    Belli schrieb:

    Ein eindimensionales Array von char - Werten muß aber nicht zwangsläufig ein Komma enthalten. Es muß auch nicht zwangsläufig ein '\0' enthalten.
    Wie also soll man die Länge feststellen, wenn man keine Ahnung hat, welche Zeichen drin sind, bzw. welches Zeichen das letzte im Array ist?
    Das ist die Frage, die Dir SeppJ gestellt hat.

    Also mal angenommen das Char (was durch die menschliche Eingabe über die Console resultiert) hat kein \0 (was ich nicht verstehe warum das so sein sollte?), wie soll dann die Console erkennen wo das ende ist? Also muss es ein \0 geben!

    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.
    Aber ein char - Array muß nicht zwangsläufig einen C-String enthalten, und ein ganz allgemeines eindimensionales Array von einem beliebigen Datentyp erst recht nicht! Und deshalb kann man die Länge eines Arrays nicht bestimmen.



  • Klar in argv stehen natürlich nur die Speicheradressen.



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


Anmelden zum Antworten