Почему мой вывод не меняется с каждой итерацией цикла?
Я создаю простое приложение на C, использующее GCC в Ubuntu на основе Conway's Game of Life. У меня есть в основном весь код, который мне нужен, но у меня проблемы с одним крошечным аспектом кода.
Мой исходный файл C:
#include <stdio.h>
#include <stdlib.h>
#define HEIGHT 32
#define WIDTH 32
#define COMPASS 8
#define SPACE '.'
unsigned long mask = 0x80000000;
unsigned long row[WIDTH] = { 0 };
unsigned long copy[WIDTH] = { 0 };
int northWest(int rowNum) {
copy[rowNum - 1] = row[rowNum - 1] >>= 1;
return copy[rowNum - 1] & row[rowNum];
}
int north(int rowNum) {
copy[rowNum - 1] = row[rowNum - 1];
return copy[rowNum - 1] & row[rowNum];
}
int northEast(int rowNum) {
copy[rowNum - 1] = row[rowNum - 1] <<= 1;
return copy[rowNum - 1] & row[rowNum];
}
int west(int rowNum) {
copy[rowNum] = row[rowNum] >>= 1;
return copy[rowNum] & row[rowNum];
}
int east(int rowNum) {
copy[rowNum] = row[rowNum] <<= 1;
return copy[rowNum] & row[rowNum];
}
int southWest(int rowNum) {
copy[rowNum + 1] = row[rowNum + 1] >>= 1;
return copy[rowNum + 1] & row[rowNum];
}
int south(int rowNum) {
copy[rowNum + 1] = row[rowNum];
return copy[rowNum + 1] & row[rowNum];
}
int southEast(int rowNum) {
copy[rowNum + 1] = row[rowNum + 1] <<= 1;
return copy[rowNum + 1] & row[rowNum];
}
void clearRows(unsigned long row[]) {
int i;
system("clear");
for (i = 0; i < HEIGHT; ++i) {
row[i] = 0;
}
}
void displayBinary(unsigned long x) {
int bit;
/*int mask;*/
for (bit = 0; bit < HEIGHT; ++bit)
{
mask = 1 << bit;
printf("%c", (x & mask) ? 'X' : SPACE);
}
printf("\n");
}
int main(void) {
int i, j, alive;
char ch;
unsigned long init32;
srand(time(NULL));
for (i = 0; i < HEIGHT; ++i) {
init32 = ((double)rand() / RAND_MAX) * 0xFFFFFFFF;
row[i] = init32;
displayBinary(row[i]);
}
do {
system("clear");
for (i = 0; i < WIDTH; ++i) {
unsigned long neighbours[COMPASS] = {
north(i),
south(i),
west(i),
east(i),
northEast(i),
northWest(i),
southEast(i),
southWest(i)
};
for (j = 0; j < COMPASS; ++j) {
alive += ((mask & neighbours[j]) ? 1 : 0);
}
displayBinary(row[i]);
}
} while ((ch = getchar()) != 'n');
return EXIT_SUCCESS;
}
Когда приложение запускается впервые, я получаю то, что ожидаю (сетка 32x32 со случайными символами 'X' и '.'), Но для каждой итерации после этого ничего не меняется. Я хочу, чтобы каждый цикл пересчитывал соседей на основе имеющихся у меня методов (north(), west() и т. Д.) И печатал новые 'X' и '.' значения в сетке 32х32.
Кто-нибудь может предложить какую-то помощь в том, как получить новые значения в массиве, который будет напечатан на экране? Я новичок в программировании на C, кстати. Благодарю.
1 ответ
Я не вижу, где вы обновляете свой массив строк нигде в коде. Разве вы не должны обновлять это в цикле do while?
Хорошо, я вижу в вашей функции, как показано ниже, вы используете строку >>= 1, чтобы изменить строку. Но поскольку вы используете передачу по значению вместо передачи по ссылке, исходное значение строки остается неизменным.
int northWest(unsigned long row, int rowNum) {
copy[rowNum - 1] = row >>= 1;
return copy[rowNum - 1];
}
Вы можете использовать проход по значению, чтобы исправить это. ИЛИ Так как ваш массив строк является глобальным, вы можете изменить его непосредственно в этих функциях, используя rowNum (индекс), который вы передаете.