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 Funktion

    srand( (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;
    

Anmelden zum Antworten