为什么我的输出不会随着每次循环迭代而改变?

时间:2014-02-05 20:25:12

标签: c arrays loops conways-game-of-life bitwise-and

我正在基于Conway的生命游戏在Ubuntu中使用GCC创建一个简单的C应用程序。我基本上拥有所需的所有代码,但是我遇到了代码的一小部分问题。

我的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;
}

当应用程序首次启动时,输出就是我所期望的(随机的'X'和'。'字符的32x32网格),但是在此之后的每次迭代中,没有任何变化。我希望每个循环根据我的方法(north(),west()等等)重新计算邻居并打印新的'X'和'。'。 32x32网格上的值。

任何人都可以提供某种帮助,帮助我们将新值放入要在屏幕上打印的数组中吗?顺便说一句,我是C语言编程的新手。感谢。

1 个答案:

答案 0 :(得分:2)

我没有看到您在代码中的任何位置更新行数组的位置。你不应该在你的do while循环中更新它吗?

好的,我在您的函数中看到如下所示,您使用行&gt;&gt; = 1来更改行。但由于您使用的是按值传递而不是按引用传递,因此原始行值保持不变。

int northWest(unsigned long row, int rowNum) {
    copy[rowNum - 1] = row >>= 1;
    return copy[rowNum - 1];
}

您可以使用传递值来修复它。 要么 由于您的行数组是全局的,您可以使用您传递的rowNum(index)直接在这些函数中更改它。