Array speicher falsche Werte
-
Ertmal Hallo allerseits.
Das ist mein erster Beitrag, aber steinigt mich bitte nicht gleich wenn ich hier irgendwas falsch macheKurz etwas zu meiner Umgebung...
Ich benutze DEV-C++ 5.11 aud Windows 7 64 Bit.Nun zu meinem Problem:
Ich möchte ein Array mit 6x4 Felder erstellen.
Nun habe ich einen Test gemacht und habe dabei einen Fehler festgestellt, den ich einfach nicht verstehe...Hier ist ein Screenshot.
Hier ist erstmal der Quellcode:
#define TAB (unsigned char) 9 #include <cstdlib> #include <iostream> //#include <ctime> using namespace std; int main(int argc, char *argv[]) { int i,j = 0; int array[6][4] = {}; // Erstellt ein Array mit 6x4 Felder --- Die {} leeren den Inhalt cout << "Hier ist array[6][4] noch leer : " << array[6][3] << endl << endl; // ---- Beschreiben ---- for (i = 1; i <= 6; i++) for (j = 1; j <= 4; j++) array[i][j] = i * j; // ---- Auslesen ---- for (i = 1; i <= 6; i++) for (j = 1; j <= 4; j++) cout << "Zeile " << (i - 1) * 4 + j << " " << TAB << "i = " << i << " j = " << j << " Inhalt = " << array[i][j] << endl; }
Das Script funktioniert soweit ganz gut, bis auf dem Problem, dass ab Zeile* 22 falsche Werte im Array stehen.
Am Anfang teste ich ob ich auch wirklich ein leeres Array habe. Das ist der Fall.
Dann schreibe ich in den Feldern die Multiplikation der "Koordinaten", auch das funktioniert, aber anscheinend nur bis Zeile* 21.
Ab Zeile 22 sind da falsche Werte drin, wo kommen die her?
Wie gesagt, das Array war leer und dann stehen da Werte drin, aber nicht die Werte, welche da rein geschriben werden sollten.* mit der Zeile meine ich die Zeile in der Konsolenausgabe
Hilfe
-
Array Indexe beginnen bei
0
und enden beiArray Grösse - 1
- deine Schleifen sind demnach falsch.// edit
Nicht nur die Schleifen, generell die Zugriffe auf das Array.
-
In C++ zählt man Indizes von 0 bis N-1, nicht von 1 bis N.
-
schau dir doch nochmal an, wie die Elemente eines Arrays genau indiziert werden. Insbesondere, wie du auf das erste Element zugreifst
-
Vielen herzlichen Dank, das war der Fehler.
So funktioniert es nun:#define TAB (unsigned char) 9 #include <cstdlib> #include <iostream> //#include <ctime> using namespace std; int main(int argc, char *argv[]) { int i,j = 0; int array[6][4] = {}; // Erstellt ein Array mit 6x4 Felder --- Die {} leeren den Inhalt cout << "Hier ist array[6][4] noch leer : " << array[6][3] << endl << endl; // ---- Beschreiben ---- for (i = 1; i <= 6; i++) for (j = 1; j <= 4; j++) array[i-1][j-1] = i * j; // ---- Auslesen ---- for (i = 1; i <= 6; i++) for (j = 1; j <= 4; j++) cout << "Zeile " << (i - 1) * 4 + j << " " << TAB << "i = " << i << " j = " << j << " Inhalt = " << array[i-1][j-1] << endl; }
Was meinst du mit "Die Zugriffe auf das Array sind falsch?"
-
Na, einen Großteil hast du doch bereits berichtigt.
Aber in deinem erstencout
ist der Index immer noch falsch.Und eine weitere Bemerkung: verzichte auf Macros, wenn immer möglich - und insbesondere in Fällen, wo sie komplett nutzlos sind. Wozu hast du ein Macro für "TAB"?
Du kannst einfach
'\t'
ausgeben oder wenn du willst, kannst du auchconstexpr char TAB = '\t';
schreiben.
-
Nochmals vielen Dank.
...ich bin begeistert wie schnell man hier Hilfe bekommt
Dieses Forum war definitiv die richtige Wahl
-
Holle schrieb:
Was meinst du mit "Die Zugriffe auf das Array sind falsch?"
Auf die Indexe bezogen; in den Schleifen hast du das jetzt ja korrigiert (wenn auch unüblich). In Zeile 13 greifst du immer noch mit einem ungültigen Index auf das Array zu.
-
Allgemeiner Tipp:
Die üblichste Art und Weise, Grenzen bei for-Schleifen anzugeben ist:for(i = startwert; i < eins_hinter_dem_endwert; ...)
oder
for(i = startwert; i != eins_hinter_dem_endwert; ...)
Aber eben nicht mit <= und ganz bestimmt nicht, indem man dann innerhalb der Schleife überall noch minus Eins rechnet.
Diese beiden Schreibweisen haben allerlei Vorteile gegenüber den Alternativen und keine echten Nachteile. Am gewichtigsten sind
a) Universelle Einsetzbarkeit, sowohl in Bezug auf die Grenzen (Mit <= muss man ganz schön frickeln in manchen Szenarien) als auch in Bezug auf die verwendeten Objekte (!= funktioniert auch bei Objekten ohne Ordnungsrelation).
b) Man sieht auf einen Blick, wie viele Durchläufe es geben wird, nämlich eins_hinter_dem_endwert - startwert.
c) Jeder macht das so und ist es so gewohnt. Wenn man es irgendwo anders sieht, ist der Leser erst einmal verdutzt und fragt sich, ob eine spezielle Absicht dahinter steht.
-
Sorry, ich bin noch blutiger Anfänger in C++
Da ich nun eine Fernlehre mache und dort auch in C++ programmieren werde versuche ich mich da halt schon mal etwas rein zu arbeiten.
Ich werde die Kritik / Tipps zu Herzen nehmen.Vor ein paar Jahren hatte ich mal in Autohotkey programmiert, aber in Scriptsprachen wird anscheinend nicht so viel Wert auf den Stil gelegt.
Danke für die Hinweise, nur so kann ich es besser machen.