代码之家  ›  专栏  ›  技术社区  ›  Mimo

C-交替指针

  •  -1
  • Mimo  · 技术社区  · 3 年前

    我一直在努力理解如何使用指针。在下面的示例中,我为《生活游戏》绘制了一个更新函数(updateGrid)的草图。其思想是在true和false之间更新网格中所有单元格的状态(您可能知道)。 然而,我应该使用指针,以便在网格的“上一个”和“新”状态之间切换。但我似乎不知道如何在不复制当前单元格网格的情况下实现交替指针的概念。有什么想法吗?

    顺便说一下,我下面的代码到目前为止运行得很好。

    // ---------- Global Variables ----------
    
    bool cells[MAX_SIZE][MAX_SIZE];
    bool cells_next[MAX_SIZE][MAX_SIZE];
    
    bool (*ptr)[MAX_SIZE][MAX_SIZE];
    bool (*ptr_next)[MAX_SIZE][MAX_SIZE];
    
    ptr = &cells;
    ptr_next = &cells_next;
    
    // ---------- update state ----------
    
    void updateState() {
        for (int row = 0; row < MAX_SIZE; ++row) {
            for (int col = 0; col < MAX_SIZE; ++col) {
                if (((*ptr)[row][col]) == 1) {
                    if ((numAliveNeighbors(row, col) < 2)
                    || (numAliveNeighbors(row, col) > 3)) {
                        (*ptr_next)[row][col] = 0;
                    } else {
                        (*ptr_next)[row][col] = 1;
                    }
                } else if (((*ptr)[row][col]) == 0) {
                    if (numAliveNeighbors(row, col) == 3) {
                        (*ptr_next)[row][col] = 1;
                    } else {
                        (*ptr_next)[row][col] = 0;
                    }
                }
            }
        }
        for (int row = 0; row < MAX_SIZE; ++row) {
            for (int col = 0; col < MAX_SIZE; ++col) {
                (*ptr)[row][col] = (*ptr_next)[row][col];
                (*ptr_next)[row][col] = 0;
            }
        }
    

    PS:我的问题解释可能有点颠簸,所以请不要犹豫,以获取更多信息。

    非常感谢:)

    1 回复  |  直到 3 年前
        1
  •  0
  •   chqrlie    3 年前

    请注意以下备注:

    • 您应该使用指向行的指针,而不是指向二维数组的指针。

    • 你可以 候补 通过临时变量交换指针。

    代码实现 John Conway 这是一款著名的世世代代生活游戏。 ptr 指向当前板和 ptr_next 指向下一代。 update() 计算应用细胞死亡和出生规则的新板。当新板完全更新后,指针将交换,因此 ptr公司 现在指向新板。这比从 cells_next cells

    以下是修改后的版本:

    // ---------- Global Variables ----------
    
    bool cells[MAX_SIZE][MAX_SIZE];
    bool cells_next[MAX_SIZE][MAX_SIZE];
    
    bool (*ptr)[MAX_SIZE] = cells;
    bool (*ptr_next)[MAX_SIZE] = cells_next;
    
    // ---------- update state ----------
    
    void updateState() {
        for (int row = 0; row < MAX_SIZE; ++row) {
            for (int col = 0; col < MAX_SIZE; ++col) {
                if (ptr[row][col]) {
                    if ((numAliveNeighbors(row, col) < 2)
                    ||  (numAliveNeighbors(row, col) > 3)) {
                        ptr_next[row][col] = 0;
                    } else {
                        ptr_next[row][col] = 1;
                    }
                } else {
                    if (numAliveNeighbors(row, col) == 3) {
                        ptr_next[row][col] = 1;
                    } else {
                        ptr_next[row][col] = 0;
                    }
                }
            }
        }
        // swap the pointers
        bool (*tmp)[MAX_SIZE] = ptr;
        ptr = ptr_next;
        ptr_next = tmp;
    }
    

    请注意 numAliveNeighbors 可能需要 ptr公司 作为参数,而不是通过全局变量隐式地。