Symbol zuweisen



  • Hallo,
    ich habe mal wieder ein kleines Problem.

    hier ist mal ein Teil meiner Funktion. Ich wollte wissen ob sich das hier auch kürzer in eine Schleife verfassen läst.
    Hab das mal Versucht aber kleiner bekomme ich es nicht hin. hier mal der Teil der funktioniert.



  • ChrisTucker schrieb:

    char **spielen (char **spielfeld1, int zeile, int spalte)	
    {
    	int j =1, x =0, i=1; //das hier zu definieren ist doch hässlich...
    	char **spielfeld2 = zeugung(0, zeile, spalte); //Initalisierung eines Hilfsfeldes
    	for (i=1; i<spalte+1; i++) //memcpy_s statt der schleife?
    	{
    		for (j=1; j<zeile+1; j++)
    		{
    			spielfeld2[i][j] = spielfeld1[i][j];												// Erzeugen eines identischen Feldes
    		}
    	}
    
    	for (i=1; i<spalte+1; i++)
    	{
    		for (j=1; j<zeile+1; j++)
    		{	
    			x =0;
    /*dafür würd ich noch ne extra funktion schreiben...
    außerdem tuts hier doch auch ne schleife (bzw. 2 ineinander)*/
    
    			if ((spielfeld1[i-1][j-1])==0x2)	//Elementnachbarn zählen und vergleichen
    				x++;
    			if ((spielfeld1[i][j-1])==0x2)
    				x++;
    			if ((spielfeld1[i+1][j-1])==0x2)
    				x++;
    			if ((spielfeld1[i+1][j])==0x2)
    				x++;
    			if ((spielfeld1[i+1][j+1])==0x2)
    				x++;
    			if ((spielfeld1[i][j+1])==0x2)
    				x++;
    			if ((spielfeld1[i-1][j+1])==0x2)
    				x++;
    			if ((spielfeld1[i-1][j])==0x2)
    				x++;
    
    			if (((spielfeld1[i][j])==0x2) && ((x<2)||(x>3)))// Lebenselement töten wenn weniger als 2 oder mehr als 3 Nachbarn vorhanden
    				((spielfeld2[i][j])=0);
    /*ich würds ja mit nem != 2 && != 3 lösen*/
    			if (((spielfeld1[i][j])==0) && (x==3))// Lebendeselement erzeugen wenn  3 Nachbarn vorhanden
    				((spielfeld2[i][j])=0x2);
    
    		}
    	}
    	return spielfeld2;	// Neues Feld zurückgeben - wozu brauchst du überhaupt noch das alte? wenn du es eh nicht veränderst, dann mach es const
    }
    

    ach so: an deiner stelle würd ich nen enum nehmen, damit du nicht jedes mal dort das 0x2 hast (mal davon abgesehen, dass ich nicht verstehe, warum man bei so was 0x2 schreibt...) - bis jz mag das ja noch gehen, aber wenn du dann noch paar andere werte hast und iwann in nem monat oder so wieder reinguckst... macht bestimmt keinen spaß dann ewig zu suchen, was noch mal welchem wert entsprach...

    und noch was: zeugung () könnte ja auch gleich das feld selbst kopieren?

    bb



  • Eigentlich wollte ich auch nur das hier ändern. Aber ich wüste nicht wie ich das in 2 schleifen verpacken soll. Achja und einige sachen kann ich leider nicht ändern weil dies nur ein kleiner Teil eines Programms mit 400 Zeilen ist.

    if ((spielfeld1[i-1][j-1])==0x2)    //Elementnachbarn zählen und vergleichen
                    x++;
                if ((spielfeld1[i][j-1])==0x2)
                    x++;
                if ((spielfeld1[i+1][j-1])==0x2)
                    x++;
                if ((spielfeld1[i+1][j])==0x2)
                    x++;
                if ((spielfeld1[i+1][j+1])==0x2)
                    x++;
                if ((spielfeld1[i][j+1])==0x2)
                    x++;
                if ((spielfeld1[i-1][j+1])==0x2)
                    x++;
                if ((spielfeld1[i-1][j])==0x2)
                    x++;
    


  • Kleiner Tipp für die Schleife:

    for(int n = -1;n<2;++n)
        for(int h = -1; h < 2; ++h)
            ... if...
    


  • Genauso hatte ich mir das ja auch vorgestellt aber dann sagt er an der stelle immer unbehandelte Ausnahme.



  • ChrisTucker schrieb:

    Genauso hatte ich mir das ja auch vorgestellt aber dann sagt er an der stelle immer unbehandelte Ausnahme.

    Jo. Dann machst du irgendwas falsch. 😉

    Wahrscheinlich greifst du ausserhalb der Grenzen zu.



  • Ah Danke Klammern haben gefehlt.

    MFG


Log in to reply