Seltsames Verhalten von char (char != string dachte ich)



  • Kollege, egal wie "merkwürdig" man "vergrößern" auch definiert oder interpretiert, es wird für dieses Beispiel niemals zutreffen.

    Es wird einfach darüber hinaus geschrieben.

    Ist wesentlich zutreffender.



  • Das erklär einiges das ein Array keinen Speicherplatz hat sonder ein Zeiger ist, das hat man uns in der Uni aber als Datentyp erklärt...

    Wie bist Du denn auf das schmale Brett gekommen, die gesamte Zeichenkette in ein Array einlesen zu wollen?

    Bleib doch bitte bei dem, was Du bisher gelernt hast. getchar() war ja offensichtlich dabei - benutz das!

    Wir haben in der Uni mit scanf() "gelernt", wir machen so nen Crashkurs und lernen da halt kaum Sachen aber die Aufgaben sollen wir halt machen...
    Ich helfe meinen Kommillitonen halt aus, habe früher halt mal aus intresse ein Pong programmiert mit c++, wir leren aber nur c.
    Getchar() kenne ich halt nur dadruch das man es nutzt damit die Konsole nicht zu geht.
    Ich werde mich jetzt mal einlesen "in" getchar().

    Danke!!!
    Das das
    Array ein Pointer ist, ist schon gut zu wissen.



  • Rarebit schrieb:

    Das das Array ein Pointer ist, ist schon gut zu wissen.

    Es ist besser zu wissen, dass es nicht so ist.

    Ein Array hat (nach der Definition) eine bestimmte Größe und eine Adresse.
    Beide kannst du zur Laufzeit nicht mehr ändern.
    Der Speicher besteht aus einem zusammenhängenden Block, der auch nur die Nutzdaten aufnimmt.
    Über den Arraynamen kommst du an die Adresse vom ersten Element.

    Ein Pointer ist eine Variable, die eine Adresse aufnimmt.
    Diese Adresse kannst du auch ändern.
    Neben den Nutzdaten, auf die der Pointer verweist, braucht der Pointer selber auch Speicher, in der die Adresse steht.


  • Mod

    Rarebit schrieb:

    Das erklär einiges das ein Array keinen Speicherplatz hat sonder ein Zeiger ist, das hat man uns in der Uni aber als Datentyp erklärt...

    Die Aussage von X ist auch Quatsch. Sofort vergessen! Ein Array ist kein Zeiger und ein Zeiger ist kein Array. Das anders zu sehen bringt einen schnell in Schwierigkeiten. Ein Array ist ein zusammengesetzter Datentyp, der einer Zusammenstellung gleichartiger Objekte entspricht, die man über einen Index ansprechen kann.

    Wir haben in der Uni mit scanf() "gelernt", wir machen so nen Crashkurs und lernen da halt kaum Sachen aber die Aufgaben sollen wir halt machen...
    Ich helfe meinen Kommillitonen halt aus, habe früher halt mal aus intresse ein Pong programmiert mit c++, wir leren aber nur c.

    Ist die Frage denn nun als C-Frage oder als C++-Frage zu verstehen? Mit scanf und C-Strings wäre dein Problem ganz einfach behebbar. Mit einem C++-String würde das Problem gar nicht erst auftauchen. Erst die Mischung aus C und C++ macht das Problem.

    Und wie bereits mehrmals gesagt wurde, ist es ohnehin merkwürdig, hier nicht die Zeichen einzeln lesen zu wollen.



  • Ich Code in C++ und daher auch als C++ Frage aufzufassen.
    Da ich immer mit C++ "gearbeitet" habe, möchte ich dies auch weiter so tun, in paar Wochen werden wir in der Uni auch darauf umsteigen.

    Strings haben wir noch nicht in der Vorlesung behandelt daher mit Arrays, aber ich weiß was ein String ist, wenn das raus das Chaos resultiert das ich C++ mit den Arrays zusammenwerfe, dann mache ich es einfach mit den Strings und fertig. 😃



  • Die Aussage von X ist auch Quatsch. Sofort vergessen! Ein Array ist kein Zeiger und ein Zeiger ist kein Array. Das anders zu sehen bringt einen schnell in Schwierigkeiten. Ein Array ist ein zusammengesetzter Datentyp, der einer Zusammenstellung gleichartiger Objekte entspricht, die man über einen Index ansprechen kann.

    Das mit den "Schwierigkeiten" empfinde ich als besonders großen Schwachsinn. Ein Array wird in C++ syntaktisch immer wie ein konstanter Zeiger behandelt. Ob du das Array als konstante Adresse auf den Anfang dieses Bereichs definierst, oder als konstanten Zeiger auf den Anfang des Bereichs ist absolut gleichwertig.



  • X schrieb:

    Ein Array wird in C++ syntaktisch immer wie ein konstanter Zeiger behandelt. Ob du das Array als konstante Adresse auf den Anfang dieses Bereichs definierst, oder als konstanten Zeiger auf den Anfang des Bereichs ist absolut gleichwertig.

    Nur mit einigen Ausnahmen. Der sizeof-Operator zum Beispiel. Über diese Sachen wird man dann irgendwann stolpern. Also besser das richtige lernen 😉


  • Mod

    X schrieb:

    Die Aussage von X ist auch Quatsch. Sofort vergessen! Ein Array ist kein Zeiger und ein Zeiger ist kein Array. Das anders zu sehen bringt einen schnell in Schwierigkeiten. Ein Array ist ein zusammengesetzter Datentyp, der einer Zusammenstellung gleichartiger Objekte entspricht, die man über einen Index ansprechen kann.

    Das mit den "Schwierigkeiten" empfinde ich als besonders großen Schwachsinn.

    Sicher. Es gibt schließlich nur zehntausende Threads alleine in diesem Forum, die darauf beruhen, dass Leute Arrays für Pointer halten oder umgekehrt. Sind wohl alle dumm, außer dir, dass wir nie bemerkt haben, dass Arrays doch Pointer sind und es gar kein Problem gab! Selbst die Leute, die den Standard geschrieben haben, hätten sich viel Text sparen können, wenn sie das gewusst hätten.

    Moment, was ist noch einmal Thema dieses Threads? Wieso hat der Threadersteller denn auf einmal Schwierigkeiten mit Arrays und Pointern, wenn das doch im Prinzip das gleiche ist?



  • Sicher. Es gibt schließlich nur zehntausende Threads alleine in diesem Forum, die darauf beruhen, dass Leute Arrays für Pointer halten oder umgekehrt. Sind wohl alle dumm, außer dir, dass wir nie bemerkt haben, dass Arrays doch Pointer sind und es gar kein Problem gab! Selbst die Leute, die den Standard geschrieben haben, hätten sich viel Text sparen können, wenn sie das gewusst hätten.

    Stell dir mal vor, ich habe mir sogar die Zeit genommen einen Blick auf diese Threads zu werfen. Lieber SeppJ, wenn ich sage, ein Array kann auch als ein konstanter Zeiger behandelt werden, setzt das voraus, dass man Zeiger auch versteht. Das trifft leider auf keinen dieser Threadersteller zu und damit ist dein Argument absolut wirkungslos.

    Nur mit einigen Ausnahmen. Der sizeof-Operator zum Beispiel.

    Gut, dann definieren wir ein Array jetzt eben als konstante Adresse. Ein Anfänger hat jetzt sicherlich bessere Chancen zu verstehen, warum die Größe des Arrays nicht außerhalb der Funktion, in der es definiert wurde, ermitteln kann *nicht*.

    Die angesprochenen "Schwierigkeiten" wird jeder Anfänger haben, ganz Gleich, ob ein Array nun ein konstanter Zeiger auf die Startadresse ist, oder eine konstante Adresse.


  • Mod

    X schrieb:

    Gut, dann definieren wir ein Array jetzt eben als konstante Adresse.

    Im Gegensatz zu? Das beschreibt jede Art von Objekt.



  • Im Gegensatz zu? Das beschreibt jede Art von Objekt.

    Jetzt kommt der interessante Teil. Prinzipiell würde die Definition dann etwa so lauten: Ein Array ist eine (konstante (gut, kann man sich wirklich sparen)) Adresse im Speicher, mit der Besonderheit, dass folgende Teile (bis Größe n) im Speicher mit einem Abstand von sizeof(Datentyp), reserviert werden.

    Und jetzt mal ehrlich, wer soll daraus die Tücken durch z.B den sizeof Operator ableiten?


  • Mod

    Du hast gerade auf ungenaue Art und Weise das wieder gegeben, was der Standard als ein Array definiert. Wo kommen nun deine Pointer ins Spiel? Zeiger sind keine Adressen, Adressen sind keine Zeiger. Der Unterschied ist wie der zwischen Verpackung und Inhalt.



  • Du hast gerade auf ungenaue Art und Weise das wieder gegeben, was der Standard als ein Array definiert.

    Dann erkläre mir jetzt bitte, wieso ein Anfänger Schwierigkeiten bekommen sollte, wenn er ein Array als konstanten Zeiger und nicht als Adresse interpretiert?
    Die sonderliche Behandlung durch den sizeof Operator ist nämlich ohne hin nicht ersichtlich.


  • Mod

    X schrieb:

    Dann erkläre mir jetzt bitte, wieso ein Anfänger Schwierigkeiten bekommen sollte, wenn er ein Array als konstanten Zeiger und nicht als Adresse interpretiert?
    Die sonderliche Behandlung durch den sizeof Operator ist nämlich ohne hin nicht ersichtlich.

    Bloß weil ein Anfänger es sowieso nicht richtig weiß, sollte man ihm nicht was falsches beibringen. Eigentlich gibt es fast nie einen Grund, jemandem was falsches bei zu bringen, die einzige Ausnahme die ich mir vorstellen kann ist, dass man dadurch einen Sachverhalt erheblich vereinfacht und dann später richtig stellen kann.

    Stellen wir fest:
    -Anfänger haben Schwierigkeiten mit Arrays
    -Anfänger haben Schwierigkeiten mit Pointern
    -Arrays sind keine Pointer, Pointer sind keine Arrays.

    Wieso sollte man einem Anfänger beibringen, dass Arrays Pointer wären?

    Zumal wir wissen, dass Anfänger Probleme bekommen, wenn sie Arrays wie Pointer behandeln oder umgekehrt. Wir haben abertausende Threads wo jemand sizeof auf Zeiger anwendet; Probleme mit dem Typ des Adressoperators bekommt; oder sich fragt, wieso man einem Zeiger auf Zeiger kein 2D-Array zuweisen kann. Denn die vereinfachte Sichtweise Pointer = Arrays bricht eben bei der kleinsten Herausforderung zusammen. Im Gegenzug hilft sie nicht einmal bei anderen Gelegenheiten, denn so lange man nichts Herausforderndes macht, hat man sowieso keine Probleme mit Pointern oder Arrays.


  • Mod

    Ein Array wird in C++ syntaktisch immer wie ein konstanter Zeiger behandelt.

    Die semantischen Unterschiede sind enorm, und darum geht es.

    Mein Versuch einer korrekten Definition: Ein Array ist ein Objekt, dass aus mehreren vollständigen, nicht-abstrakten Objekttypen zusammengesetzt ist. Diese Objekttypen nennt man die Elementtypen, und N nennt man den Array-bound. Dieser ist eine positive Ganzzahl. Arrays haben i.d.R. das (Subobjekt-)Alignment ihrer Elemente. Sie können implizit zu einem Zeiger auf den Elementtyp konvertiert werden, welcher immer auf das erste Element zeigt. Das erste Element hat dieselbe Adresse hat wie das Arrayobjekt selbst. Die Größe eines Arrayobjektes ist N*sizeof Elementtyp, was impliziert dass kein Padding zwischen Elementen existieren kann. Multidimensionale Arrays (i.e. Arrays dessen Elementtyp ein Array ist) werden reihenweise gespeichert.



  • Wieso sollte man einem Anfänger beibringen, dass Arrays Pointer wären?

    Weil dadurch genau dieser Fall zutrifft:

    Eigentlich gibt es fast nie einen Grund, jemandem was falsches bei zu bringen, die einzige Ausnahme die ich mir vorstellen kann ist, dass man dadurch einen Sachverhalt erheblich vereinfacht und dann später richtig stellen kann.

    Ein Array wird, wie ich bereits sagte, syntaktisch wie ein Zeiger behandelt und selbst die Zeigerarithmetik unterscheidet sich nicht im geringsten von der Arithmetik eines Arrays.
    Dem Anfänger willst du dann sugerrieren, ein Zeiger ist kein Array, mit der Folge, dass völlige Verwirrung herrscht. Die Unterschiede wird er sowieso nicht verstehen und daraus wiederum folgt noch mehr Verwirrung.

    Unnötig, weil die wenigen Einzelfälle, in denen sich Arrays wirklich von Zeigern unterscheiden für Anfänger nicht relevant sind und zurück gestellt werden können.

    Außerdem zeigt sich schon durch den Quellcode, dass ein blutiger Anfänger um Hilfe fragt:

    #include <iostream> 
    using namespace std; 
    
    char eingabe[1]; 
    int  main() 
    { 
            cin >> eingabe; 
        getchar(); 
    
        cout << sizeof(eingabe); 
            cout << eingabe; 
    
        getchar(); 
        return 0; 
    }
    

    Es reicht für ihn zu wissen, dass er die Grenze des Arrays überschreitet.



  • Die semantischen Unterschiede sind enorm, und darum geht es.

    Um das einzuschränken habe ich mich auch auf einen kostanten Zeiger fest gelegt. Leute, .. schaut euch doch noch mal seinen Quellcode an und beantwortet mir die Frage, ob es wirklich sinnvoll ist, ihm hier die Unterschiede zu erklären, oder ob man im Rahmen des gegebenen Beispiels nicht lieber etwas oberflächlicher darauf eingehen sollte.


  • Mod

    Wir wissen, dass diese Erklärung zu Problemen führt! Wie schon 2x gesagt, dreht sich so ziemlich jeder Array/Pointer-Thread in diesem Forum darum, dass jemand Array=Pointer beigebracht bekommen hat und dann damit in Probleme läuft, sofern er auch nur so etwas einfaches macht, wie eine Funktion aufzurufen.

    Deine Erklärung, wieso es trotzdem eine gute Idee sein sollte, einem blutigen Anfänger dies beizubringen, ist nicht befriedigend. Dieser Thread ist selber ein Beispiel dafür. Der Threadersteller hat sowohl mit Arrays als auch mit Pointern Schwierigkeiten und ist nun verwirrter als jemals zuvor, nachdem du ihm gesagt hast, dass sie das selbe wären.

    Unnötig, weil die wenigen Einzelfälle, in denen sich Arrays wirklich von Zeigern unterscheiden für Anfänger nicht relevant sind und zurück gestellt werden können.

    Diese Behauptung ist empirisch widerlegt.

    Es reicht für ihn zu wissen, dass er die Grenze des Arrays überschreitet.

    Genau. Wieso ihm dann noch irgendwelchen Quatsch über Zeiger und Arrays beibringen? Arrays können sich wie Zeiger auf ihr erstes Element verhalten. Fertig. Sachlich richtig und es ist alles gesagt, was zum Verständnis des Codes notwendig ist. Wenn der Threadersteller mit Zeigern oder Arrays Schwierigkeiten hat und diese Erklärung nicht versteht, dann versteht er auch nicht die falsche Erklärung Array=Zeiger.



  • @X
    Die Aussage dass ein Array in C++ immer gleich wie ein konstanter Zeiger behandelt wird ist einfach nur Schwachsinn. Da kannst du dich noch sehr aufplustern und blöde "ja aber" Antworten schreiben. Ändert daran nix.

    Alleine die sizeof -Geschichte und die Möglichkeit Zeiger bzw. Referenzen auf Arrays (inklusive Grössenangabe!) zu verwenden zeigt das ganz deutlich.

    Was einem Anfänger hilft und was nicht ist dann wieder ein ganz anderes Thema. Im Zweifelsfall aber auch nicht die sinnfreie Unwahrheit.



  • @Arcoth danke für deine Definition!

    Bin sehr überrascht das hier so eine Diskussion entstanden ist.
    Meiner steits kann ich sagen das meine Frage beantwortet ist.

    meiner meinung nach closed, lese aber weiter die diskussion 🙂

    @X
    naja so ein blutiger Anfänger bin ich dann doch nicht würde ich jetzt mal von mir behaupten, ein normaler Anfänger, eigentlich verstehe ich schon was ein Poiner ist (seine Vorteile)und was ein Datentype wie Int oder Double...
    Wie man sieht Pointer 😉
    Kleiner Codeausschnitt von den Hausaufgaben

    int quersummenrechner(string *spnt, int *ipnt) 
    {	
    
    	int n = *ipnt;
    	return aufrufderwerte(spnt,n);
    }
    
    int  main()
    
    {
    	string sKBI;
    	int stringsize;
    	while (true)
    	{
    	stringsize = input(&sKBI);
    	cout << "Das Passwortes: " << sKBI << endl;
    	cout << "Mit " << stringsize << " Zeichen hat die Quersumme: " << quersummenrechner(&sKBI, &stringsize) << endl;
    	}
    	return 0;
    }
    

Anmelden zum Antworten