Seltsames Verhalten von char (char != string dachte ich)
-
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?
-
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.
-
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.
-
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*sizeofElementtyp, 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.
-
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 Hausaufgabenint 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; }
-
Dafür, dass du angeblich weißt, was ein Zeiger ist, benutzt du ganz schön viele und auf komische Art und Weise. Zeiger auf String?

Daumenregeln für Übergabe von Objekte an Funktionen:
Soll das Objekt über den Zeiger verändert werden dürfen? Falls nein: Zeiger auf const benutzen. Sieht mir so aus, als wäre das hier der Fall.
Soll der Zeiger NULL sein dürfen? Falls nein: Referenz statt Zeiger benutzen (bzw. Referenz auf const). Sieht mir so aus, als wäre dies ebenfalls der Fall.
Gibt es überhaupt einen Grund für eine Indirektion? Falls nein: Keine Referenz benutzen. Sieht mir so aus, als wäre das zumindest beim int der Fall.
Die letzte Regel ist die weicheste, die anderen beiden sollte man aber stets beachten.
-
Rarebit schrieb:
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; }Ich hoffe, Du lässt Deinem Kommilitonen ein wenig Platz für eigene Lösungen.
Deine Strategie und deren Implementierung sind mindestens "ungewöhnlich". SeppJ hat ja schon was dazu geschrieben...
-
Rarebit schrieb:
@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 Hausaufgabenint quersummenrechner(string *spnt, int *ipnt) /* Wofür die Zeiger? Was du machen kannst ist eine Referenz für string zu nutzen: const string& spnt Dadurch muss das Objekt nicht kopiert werden. Ist aber optional. Der Zeiger für ipnt ist absolut nicht notwendig. */ { int n = *ipnt; /* Warum dieser Umweg über das n? Stattdessen: return aufrufderwerte(spnt, *ipnt); Wobei man hier sieht, dass die Funktion insgesamt überflüsig ist, da sie eh nur durchreicht. */ return aufrufderwerte(spnt,n); } int main() { string sKBI; int stringsize; while (true) { /* Nimm eine non-const Referenz für input. */ stringsize = input(&sKBI); cout << "Das Passwortes: " << sKBI << endl; cout << "Mit " << stringsize << " Zeichen hat die Quersumme: " << quersummenrechner(&sKBI, &stringsize) << endl; } return 0; }
-
Soll der Zeiger NULL sein dürfen? Falls nein: Referenz statt Zeiger benutzen (bzw. Referenz auf const). Sieht mir so aus, als wäre dies ebenfalls der Fall.
Vorsicht. Es gibt Religionen die dem GSG folgen.
-
GSG?
-
Weiß schon, daß ich jetzt wieder einen auf den Deckel krieg.
char eingabe[100]; cin >> eingabe; int qs = 0; for( int i = 0; eingabe[i]; qs += eingabe[i++] - '0' ); cout << qs;Ich weiß auch, daß das keine Antwort auf deine Fragen zur Funktion von pointers und arrays ist.
Eingabe: 1003
Ausgabe trotzdem: 4Erklärung irgendjemand? Wird die '\0' automatisch vor '\n' angehängt?
-
EOP schrieb:
Eingabe: 1003
Ausgabe trotzdem: 4Was hättest du denn sonst erwartet?
Erklärung irgendjemand? Wird die '\0' automatisch vor '\n' angehängt?
Von welchem \n redest du?
-
Hab's auch so schon nach ein bißchen Überlegen kapiert.
Das '\n' war gemeint wenn ich âm Schluß auf [ENTER] draufhau.SeppJ - der Mann, der niemals schläft. Bist du ein Yogi oder sowaws? Es ist 3:58. Kein normaler Mensch ist um die Zeit wach.
[quote="SeppJ"]
EOP schrieb:
Eingabe: 1003
Ausgabe trotzdem: 4Was hättest du denn sonst erwartet?[quote]Das es nach der 0 abbricht.
EDIT:
War auch Quatsch. Bin aber um 4:00 nicht mehr so ganz klar im Kopf.
-
EOP schrieb:
Hab's auch so schon nach ein bißchen Überlegen kapiert.
Das '\n' war gemeint wenn ich âm Schluß auf [ENTER] draufhau.Und wie of hast du schon erlebt, dass der Operator>> irgendeine Art von Whitespace einliest?
Das es nach der 0 abbricht.
EDIT:
War auch Quatsch.