Error in Game Of Life

I have a working code of Life of Life. This saves each population as a bitmap. Here's what the result looks like (cropped):

desired output

When clearing the code, I found that if I commented out or otherwise deleted line 60:

cout << "Survivor: " << x << ", " << y << "\n"; 

This completely confuses the program, and instead of creating such a glider, he should do this:

faulty output

I poked, trying to figure out what might cause this, but I still have not been successful. This is my current code:

 //Bitmap Library from http://partow.net/programming/bitmap/ #include "bitmap_image.hpp" #include <iostream> #include <stdio.h> #include <string.h> #include <unistd.h> using namespace std; #define WIDTH 160 #define HEIGHT 128 bool population[WIDTH][HEIGHT]; bool survivors[WIDTH][HEIGHT]; int check_survivors(); int check_neighbors(int x, int y); int write_population(char* file); int main() { int i, populations; cout << "Enter number of populations: "; cin >> populations; //Glider survivors[28][100] = true; survivors[29][100] = true; survivors[29][101] = true; survivors[30][101] = true; survivors[28][102] = true; //Initial image generation write_population("population0.bmp"); //populations for (i = 0; i < populations; i++) { char filename[17] = "population"; char ii[3]; sprintf(ii, "%d", i+1); strcat(filename, ii); strcat(filename, ".bmp"); check_survivors(); write_population(filename); } return 0; } int check_survivors() { //set x and y variables int x, y; for (x = 0; x < WIDTH; x++) { for (y = 0; y < HEIGHT; y++) { if (check_neighbors(x, y)) { survivors[x][y] = true; cout << "Survivor: " << x << ", " << y << "\n"; } else { survivors[x][y] = false; } } } return 0; } int check_neighbors(int x, int y) { int neighbors = 0, survives; //I really need to rewrite this mess //Neighbors above if (population[x-1][y-1] == true && x != 0 && y != 0) { neighbors++; } if (population[x][y-1] == true && y != 0) { neighbors++; } if (population[x+1][y-1] == true && x != WIDTH-1 && y != 0) { neighbors++; } //Neighbors next to if (population[x-1][y] == true && x != 0 ) { neighbors++; } if (population[x+1][y] == true && x != WIDTH-1) { neighbors++; } //Neighbors below if (population[x-1][y+1] == true && x != 0 && y != HEIGHT-1) { neighbors++; } if (population[x][y+1] == true && y != HEIGHT-1) { neighbors++; } if (population[x+1][y+1] == true && x != WIDTH-1 && y != HEIGHT-1) { neighbors++; } //Determining life or death if (neighbors < 2 || neighbors > 3) { //Neighbors less than 2 or more than 3 is dead cell survives = 0; } else if (neighbors == 3 && population[x][y] == false) { //Exactly 3 neighbors re-animates a cell survives = 1; } else if (population[x][y] == true) { //2 or 3 neighbors is survivor survives = 1; } return survives; } int write_population(char* file) { //Create Image bitmap_image image(WIDTH, HEIGHT); //Set background to white image_drawer draw(image); image.set_all_channels(255,255,255); //set x and y variables int x, y; //For every array point, check to see if it survives, //and transfer survivors to population for (x = 0; x < WIDTH; x++) { for (y = 0; y < HEIGHT; y++) { if (survivors[x][y] == true) { draw.pen_width(1); draw.pen_color(0,0,0); draw.plot_pixel(x, y); } population[x][y] = survivors[x][y]; } } //Save image image.save_image(file); //return return 1; } 
+8
c ++ conways-game-of-life
source share
2 answers

Such things:

 if (population[x-1][y-1] == true && x != 0 && y != 0) 

need to rewrite as:

 if ( x > 0 && y > 0 && population[x-1][y-1] == true ) 

otherwise, you will fall directly into the scope of undefined behavior if either x or y are 0 (since they will check_neighbors() several times when you call check_neighbors() from check_survivors() ), and you can expect strange, unexplained errors like this. Before attempting to access these elements, you need to check the invalid array indexes.

Also here:

 if (neighbors < 2 || neighbors > 3) { //Neighbors less than 2 or more than 3 is dead cell survives = 0; } else if (neighbors == 3 && population[x][y] == false) { //Exactly 3 neighbors re-animates a cell survives = 1; } else if (population[x][y] == true) { //2 or 3 neighbors is survivor survives = 1; } 

it seems that survives can be left with an undefined value if neighbors == 2 and population[x][y] == false , which will also lead to undefined behavior if you have to access this value. It’s not immediately clear from your code whether there may be such a combination of circumstances, but if you are still at the debugging stage, then at least it’s worth adding a status check to check if it ever really is.

If your program exhibits undefined behavior like this, then it is almost impossible to explain until these problems are fixed.

+6
source share

You do not always assign a value to the survives variable, for example. if population[x][y] is false and the neighbors are 2. This leaves survives with the value of what is in memory at that time. When you add a cout call, it will probably be set that the stack memory bit is 0, masking your program error.

Add the declared value to survives when you declare it.

+3
source share

All Articles