Code: #include<stdio.h> #include<stdlib.h> #include <malloc.h> #include <math.h> #include <sys/time.h> #define ALIVE 1 #define DEAD 0 int **array = NULL; int **history = NULL; int HEIGHT; int WIDTH; double gettime(void) { struct timeval tval; gettimeofday(&tval, NULL); return( (double)tval.tv_sec + (double)tval.tv_usec/1000000.0 ); } int **allocarray(int P, int Q) { int i; int *p, **a; p = (int *)malloc(P*Q*sizeof(int)); a = (int **)malloc(P*sizeof(int*)); if (p == NULL || a == NULL) printf("Error allocating memory\n"); /* for row major storage */ for (i = 0; i < P; i++) a[i] = &p[i*Q]; return a; } void initarray() { int i,j; for (i=1; i<HEIGHT-1; i++){ for (j=1; j<WIDTH-1; j++){ if(drand48()>0.5){ array[i][j] = 1; } else{ array[i][j] = 0; } } } } void printTable(int **table) { int height, width; for (height = 1; height < HEIGHT-1; height++) { for (width = 1; width < WIDTH-1; width++) { if (table[height][width] == ALIVE) { printf(" X "); } else { printf(" 0 "); } } printf("\n"); } printf("\n"); } //to clear up everything void clearTable() { int height, width; for (height = 0; height < HEIGHT; height++) { for (width = 0; width < WIDTH; width++) { array[height][width] = DEAD; } } } int getNeighborValue(int **table, int row, int col) { if (table[row][col] == ALIVE) { return 1; } else { return 0; } } int getNeighborCount(int **table, int row, int col) { int neighbor = 0; neighbor += getNeighborValue(table, row - 1, col - 1); //top left neighbor += getNeighborValue(table, row - 1, col); //top neighbor += getNeighborValue(table, row - 1, col + 1); //top right neighbor += getNeighborValue(table, row, col - 1); //left neighbor += getNeighborValue(table, row, col + 1); //right neighbor += getNeighborValue(table, row + 1, col - 1); //below left neighbor += getNeighborValue(table, row + 1, col); // below neighbor += getNeighborValue(table, row + 1, col + 1); //below right return neighbor; } void calculate() { int **tableB = NULL; int neighbor, height, width; tableB = allocarray(HEIGHT, WIDTH); for (height = 1; height < (HEIGHT-1); height++) { for (width = 1; width < (WIDTH-1); width++) { neighbor = getNeighborCount(array, height, width); if (neighbor==3) { tableB[height][width] = ALIVE; } else if (neighbor == 2 && array[height][width] == ALIVE) { tableB[height][width] = ALIVE; } else { tableB[height][width] = DEAD; } } } for (height = 1; height < (HEIGHT-1); height++) { for (width = 1; width < (WIDTH-1); width++) { array[height][width] = tableB[height][width]; } } } int matchArray(){ int count = 0; int height,width,flag=0; for(height = 0; height<HEIGHT; height++){ for(width = 0; width<WIDTH; width++){ if(array[height][width] != history[height][width]){ count++; } } } if(count>0){ flag = 1; } return flag; } int main(int argc, char *argv[]) { int generation = 0; int i; double starttime, endtime, time; int height,width; int flag = 0; if (argc!=3) printf("You need to enter the size of the matrix and the number of generations in the comment line arguement\n"); else { printf("The matrix size given is:%s\n",argv[1]); HEIGHT = atoi(argv[1])+2; WIDTH = HEIGHT; array = allocarray(HEIGHT, WIDTH); history = allocarray(HEIGHT, WIDTH); clearTable(); // askUser(table); //loadTestData(array); initarray(); //printTable(array); //printf("Test data as Generation 0\n"); //printf("-----------\n"); starttime= gettime(); //printf("Starttime= %f", starttime); for(i=0; i<(atoi(argv[2])); i++) { for (height = 0; height < HEIGHT; height++) { for (width = 0; width < WIDTH; width++) { history[height][width] = array[height][width]; } } calculate(); flag = matchArray(); //printf("The flag value is:%d\n",flag); if(flag == 0){ break; } // printTable(array); //printf("\n======================================\n"); //printTable(history); //printf("Generation %d\n", ++generation); } endtime= gettime(); //printf("Endtime= %f", endtime); time= (endtime-starttime); printf("Time taken= %1f\n", time); } return 0; } Hi, I have written the code but it seem theres some problem. Its showing answer with small size matrices, but not with bigger ones. I need to use lesser amt of memory. Can anyone suggest any good way to do it? Thanks! smbee