簡體   English   中英

為什么我的C代碼不打印任何輸出?

[英]Why is my C code not printing any output?

我正在ANSI 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 neighbours[COMPASS] = { 0 };
unsigned long row[WIDTH] = { 0 };
unsigned long copy[WIDTH] = { 0 };

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

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

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

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

int east(unsigned long row, int rowNum) {
    copy[rowNum] = row <<= 1;
    return copy[rowNum];
}

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

int south(unsigned long row, int rowNum) {
    copy[rowNum + 1] = row;
    return copy[rowNum + 1];
}

int southEast(unsigned long row, int rowNum) {
    copy[rowNum + 1] = row <<= 1;
    return copy[rowNum + 1];
}

/*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, 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 < HEIGHT; ++i) {
            neighbours[0] = north(row[i], i);
            neighbours[1] = south(row[i], i);
            neighbours[2] = west(row[i], i);
            neighbours[3] = east(row[i], i);
            neighbours[4] = northWest(row[i], i);
            neighbours[5] = northEast(row[i], i);
            neighbours[6] = southEast(row[i], i);
            neighbours[7] = southWest(row[i], i);
        }
        for (i = 0; i < HEIGHT; ++i) {
            alive += ((mask & neighbours[i]) ? 1 : 0);
            displayBinary(row[i]);
        }
    } while ((ch = getchar()) != 'n');

    return EXIT_SUCCESS;
}

我的目標是在32x32板上印刷隨機的“ X”字符,並在用戶不鍵入“ n”的情況下進行程序循環。 對於每個循環迭代,我希望每個坐標檢查其鄰居,如果它的鄰居少於兩個或鄰居大於三個,則“死亡”。 否則,它將“運行”並在該坐標處打印“ X”。

我了解使用按位與運算可能不是完成此操作的最佳方法,但是我的教授要求我們使用按位與運算,因此我無法更改該邏輯。

我在清除循環之間的行時遇到問題。 有人可以幫我弄清楚如何為do循環的每次迭代打印更新的行嗎?

任何幫助深表感謝。 謝謝。

為了顯示正在發生的事情,我添加了此定義,

//#define SPACE (0x20)
#define SPACE ('.')

然后,我更改了您打印空間的兩個實例,

printf("%c", 0x20);

printf("%c", SPACE);

然后運行您的程序,並在一行中添加一些“。”。 和一些“ X”,但第二遍結果全為“。”,

看來您對相鄰節點的計算可能是錯誤的。

為什么打印錯誤?

由於您的第一個COMPASS循環使用displayBinary()8次,

for (i = 0; i < COMPASS; ++i) {
    init32 = ((double)rand() / RAND_MAX) * 0xFFFFFFFF;
    row[i] = init32;
    displayBinary(row[i]);
}

雖然您的后續外觀使用printf(而不是調用displayBinary),但8次只能打印8個字符,

    for (i = 0; i < COMPASS; ++i) {
        alive += ((mask & row[i]) ? 1 : 0);
        if ((alive == 2) || (alive == 3))
            printf("%c", 'X');
        else
            printf("%c", SPACE);
    }

您的HEIGHT循環會重新計算neighbours [],但是您應該重設row []。

我重寫了displayBinary函數,它顯示了整行,

void displayBinary(unsigned long x) {
    //do {
    //    printf("%c", (x & mask) ? 'X' : SPACE);
    //} while ((mask >>= 1) != 0);
    int bit;
    int mask;
    for( bit=0; bit<32; ++bit )
    {
        mask = 1<<bit;
        printf("%c", (x & mask) ? 'X' : SPACE);
    }
    printf("\n");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM