C++ Zugriff außerhalb eines Mehrdimensionalen Arrays verbieten

07/10/2014 17:56 newchild#1
Sehr geehrte epvp-Community,
ich versuche ein eigenes Spiel des Lebens (Conway) als Hausaufgabe zu programmieren. Dieses Programm ([Only registered and activated users can see links. Click Here To Register...]) funktioniert auch soweit, jedoch testet die Funktion getNachbarn auch Zahlen außerhalb des Spielfeldes(Array). (Bild: [Only registered and activated users can see links. Click Here To Register...]).

Nun wollte ich wissen ob man so einen Zugriff auch "verbieten" kann, oder ob ich alles mühsam einprogrammieren muss.

Danke für die Hilfe im Vorraus.
07/10/2014 18:55 MrSm!th#2
[Only registered and activated users can see links. Click Here To Register...]

Code:
	

    int getNachbarn(int Liste[X][Y], int XKoor, int YKoor)
    {
            int Anzahl= 0;
            for(int i = XKoor - 1; i <= XKoor + 1; i++)
            {
                    for (int ci = YKoor - 1; ci <= YKoor + 1; ci++)
                    {
                            if (i < 0 || i >= X || ci < 0 || ci >= Y || (i == XKoor && ci == YKoor))
                            {
                                    continue;
                            }
                            if (Liste[i][ci] == 1)
                            {
                                    Anzahl++;
                            }
                    }
            }
            cout << Anzahl << endl;
            return Anzahl;
    }
Hab jetzt einfach mal etwas schöner formatiert (Lektion 1: formatier deinen Code ordentlich, insbesondere Leerzeichen erhöhen die Lesbarkeit ungemein) und die zusätzlichen Bedingungen für die Feldgrenzen eingefügt.

Mit C++11 Magic lässt sich das bestimmt noch schöner schreiben.
07/10/2014 19:08 newchild#3
Quote:
Originally Posted by MrSm!th View Post
[Only registered and activated users can see links. Click Here To Register...]

Code:
	

    int getNachbarn(int Liste[X][Y], int XKoor, int YKoor)
    {
            int Anzahl= 0;
            for(int i = XKoor - 1; i <= XKoor + 1; i++)
            {
                    for (int ci = YKoor - 1; ci <= YKoor + 1; ci++)
                    {
                            if (i < 0 || i >= X || ci < 0 || ci >= Y || (i == XKoor && ci == YKoor))
                            {
                                    continue;
                            }
                            if (Liste[i][ci] == 1)
                            {
                                    Anzahl++;
                            }
                    }
            }
            cout << Anzahl << endl;
            return Anzahl;
    }
Hab jetzt einfach mal etwas schöner formatiert (Lektion 1: formatier deinen Code ordentlich, insbesondere Leerzeichen erhöhen die Lesbarkeit ungemein) und die zusätzlichen Bedingungen für die Feldgrenzen eingefügt.

Mit C++11 Magic lässt sich das bestimmt noch schöner schreiben.
Trotzdem scheint das noch nicht so ganz zu funktionieren ( [Only registered and activated users can see links. Click Here To Register...] man beachte die 4en)
07/10/2014 19:15 th0rex#4
Habe mir dein Programm nicht komplett angeguckt, aber
#define X 5
#define Y 5
Damit geht dein array von 0 bis einschließlich 4. Womit
Code:
       while(YKoor>5){
            cout << "Zahl zu gross. Bitte erneut eingeben" << endl;
            cin >> YKoor;
        }
bei einer eingabe von 5 auch einen Fehler schmeißen wird. Dadurch kann auch 4 ausgegeben werden. Guck dir vielleicht arrays nochmal an.
07/10/2014 19:29 newchild#5
Okay. Nach diesem "Debug" ([Only registered and activated users can see links. Click Here To Register...]) habe ich das Problem erkannt. Durch diese
Code:
for(int i = 0; i<X; i++){
            for(int ci = 0; ci<Y; ci++){
                if(getNachbarn(Feld,i,ci) < 2){
                    Feld[i][ci]=0;
                }
                else{
                  if(getNachbarn(Feld,i,ci)<=3){
                    Feld[i][ci]=1;
                }
                else{
                    Feld[i][ci]=0;
                }
            }
        }
        }
Schleife werden sofort neue Zellen gesetzt. Dies sollte jedoch nicht sein , da sonst das Spiel quasi bereits gespielt wird. Somit benötige ich ein weiteres Array für ein neues "Spielbrett". Danke aber für die Hilfe :)

EDIT: Ja jetzt funktioniert es perfekt :)