【问题标题】:Make 1D array addressable with row and column使一维数组可通过行和列寻址
【发布时间】:2017-06-27 17:46:19
【问题描述】:

我正在使用 C 中的数组(单维)编写国际象棋引擎?

#define ROW(sq)         (sq >> 3)
#define COL(sq)         (sq & 7)

int board[64] = {
   0,1,2,3,4,5,6,7,
   8,9,10,11,12,13,,14,15,
   .......................
   .......................
   56,57,48,59,60,61,62,63
}

现在: 要获取数字 11 的行和列,我使用以下命令:

int r = ROW(11);
int c = COL(11);

它给出:

r = 1
c = 3

请帮助我编写一个函数,以便将参数作为rc 并给出正确的正方形,例如:

sq = fnc(r,c);
sq = fnc(1,3);
sq = 11;

【问题讨论】:

  • 您考虑过int board[8][8]吗?还是单维是必需的?
  • @GAURANGVYAS:二维数组与一维数组不同。即使对于可变大小的数组,不使用二维数组也是没有意义的。
  • @Olaf 我的错。在没有正确看到问题的情况下发表评论。
  • 我知道这已经很老了,但我不同意“没有理由不使用 2D 数组”。二维数组在内存中的布局与一维数组完全相同。它实际上是一个数组数组。使用 1D 数组作为数据并选择将其绘制为 2D 可视网格没有任何问题。将数据配置与其可视化表示分离非常好。

标签: c chess


【解决方案1】:

您只需要计算row * MAX_COL + col,其中MAX_COL = 8。使用row * MAX_COL,您将进入下一行,如下图所示:

                   1 * 8 ---                 2 * 8 ---
                           |                         |
|         row = 0        | v       row = 1         | v       row = 2
| 0  1  2  3  4  5  6  7 | 8  9  10 11 12 13 14 15 | 16 ...

如果你想要一个使用全局变量board的宏:

#define FIELD(row,col) board[(row) * 8 + (col)]

或者作为同样使用全局定义的board变量的函数:

inline int FIELD (int row, int col)
{
   return board[row * 8 + col]
}

如果您想将板作为数组传递给函数,您可以执行以下操作,其中 int boardArr[] decays 指向指针:

inline int FIELD (int boardArr[], int row, int col)
{
   return boardArr[row * 8 + col]
}

您还应该更改宏定义,因为如果传递的参数是计算中使用的值,它们是不安全的。你可以阅读它here on SO。所以你应该在参数sq周围使用大括号:

#define ROW(sq)   ((sq) >> 3)
#define COL(sq)   ((sq) & 7)

使用内联函数会更好,正如 SO 答案中所说的那样。

【讨论】:

    【解决方案2】:

    如果您的棋盘始终是 8x8,您可以看到每个 r 从 0、8、16... 开始,每个 c 只是与这些初始点的偏移量,因此给定 r 和 @ 987654324@,可以通过board[(r * 8) + c]计算数组索引得到对应的片。

    【讨论】:

      【解决方案3】:

      最好使用二维数组来解决这个问题,因为这样您就可以简单地访问board[r][c]

      如果你(或你的教授)坚持使用一维数组,这个宏会做你想做的:

      #define GET_PIECE(r, c) (board[((c) + (8) * (r))])
      

      请注意所有内容是如何用括号括起来的。 This is very important with macros!

      更好的解决方案是使用inline function

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 2020-10-15
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多