c++ probleme mit 3 dimensionalen Arrays und rand()
-
Moin,
ich habe ein Problem bei C++, ich möchte zufällig eine '#' in einem Feld von 10*30 ausgeben, das ganze funktioniert auch, solange ich eins nach dem anderen ausgebe. Wenn ich jedoch die rand() funktion mit einfüge in meinem fall :srand( (unsigned) time(NULL) ) ; x = 1 + ( rand() % 10 + 1 ); y = 1 + ( rand() % 30 + 1 );
Passieren ganz komische dinge wie Herzen Smiley etc.
Hier mal mein gesamter code:
#include <iostream> #include <stdio.h> #include <conio.h> #include <Windows.h> #include <string> #include <time.h> using namespace std; char feld[10][30]; int b=0,x,y; int feld_f(); int main() { //leerstelle in jedes array. for(int z1 = 1;z1 <= 10;z1++) { for(int z2 = 1;z2 <= 30;z2++) { feld[z1][z2] = ' '; } } for(int z1 = 1;z1 <= 10;z1++) { for(int z2 = 1;z2 <= 30;z2++) { srand( (unsigned) time(NULL) ) ; x = 1 + ( rand() % 10 + 1 ); y = 1 + ( rand() % 30 + 1 ); feld[x][y] = '#'; feld_f(); feld[x][y] = ' '; system("cls"); } } system("pause"); return 0; } int feld_f() { cout <<"+------------------------------+"<<endl; for(int z1 = 1;z1 <= 10;z1++) { cout <<"|"; for(int z2 = 1 ;z2 <= 30;z2++) {cout <<feld[z1][z2]; } cout <<"|" <<endl; } cout <<" +------------------------------+"<<endl; return 0; }
Mfg MaTTaDox
EDIT:
Hier nochmal 2 Beispiele:
So sieht es aus:
https://mattadox.de/picture/b1.png
So soll es z.B aussehen:
https://mattadox.de/picture/b2.png
-
Hey,
das erste Problem ist, das ein Array der Größe 10 mit einem Index von 0 bis 9 angesprochen werden muss.
In deinem Fall liest sowie schreibst du schon über die Grenzen des Array Speichers hinaus.Was auch immer dann da im Speicher steht wird auch ausgeben.
-
Ich denke das liegt daran dass Arrays bei 0 anfangen.
Beispiel:for(int z1 = 1;z1 <= 10;z1++) { for(int z2 = 1;z2 <= 30;z2++) { feld[z1][z2] = ' '; } }
müsste
for(int z1 = 0;z1 < 10;z1++) { for(int z2 = 0;z2 < 30;z2++) { feld[z1][z2] = ' '; } }
heißen.
Drum kann es passieren dass du Daten ausgibst auf die du (eigentlich) gar nicht zugreifen darfst. Und da kann dann alles mögliche drinnen stehen, auch Herzchen und Smilies.EDIT: Zu Spät.
-
Oh... da hatte ich wohl einen denkfehler dachte array[10] bedeutet 0-10 ...
Funktioniert jetzt alles wie es soll, hab die arrays jetzt anderes deklariert, array[11][31]Vielen Dank nochmal, war schon am verzweifeln
-
Damit verschenkst du aber den Speicher für das Element mit Index 0
Macht bei einem char Array nicht viel aus, ist aber kein schöner Stil.
-
Hab mit dem 0er noch was vor.
-
Und noch etwas:
die Funktionsrand( (unsigned) time(NULL) ) ;
nur einmal am Anfang des Programms aufrufen, dann sonst in der Schleife dieselben Zufallszahlen entstehen (d.h. solange sich die Sekunden nicht ändern)!
Edit: und noch mehr Tipps:
- nur die Header-Dateien einbinden, die auch wirklich benötigt werden (d.h. mindestens <Windows.h> entfernen)
- generell versuche auf system()-Aufrufe zu verzichten (da du ja <conio.h> eingebunden hast, findest du dort bessere Funktionen!)- benutze statt der Zahlen-Literale besser Konstanten (damit du diese bei Bedarf an nur einer Stelle im Programm anpassen mußt:
const int MaxRows = 10; const int MaxColumns = 30;