使用行和列使一维数组可寻址
Make 1D array addressable with row and column
我正在 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
请帮我写一个函数,它接受参数 r
和 c
并给出正确的平方,如:
sq = fnc(r,c);
sq = fnc(1,3);
sq = 11;
您只需计算 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 答案中所述,使用内联函数会更好。
如果你的棋盘总是 8x8,你可以看到每个 r
从 0, 8, 16...开始,每个 c
只是从这些初始点开始的偏移量,所以给出一个r
和c
,可以通过board[(r * 8) + c]
计算数组索引得到对应的片
最好使用二维数组来解决这个问题,因为这样您就可以简单地访问 board[r][c]
.
如果你(或你的教授)坚持一维数组,这个宏会做你想做的事:
#define GET_PIECE(r, c) (board[((c) + (8) * (r))])
注意所有内容是如何用括号括起来的。 This is very important with macros!
更好的解决方案是使用 inline function.
我正在 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
请帮我写一个函数,它接受参数 r
和 c
并给出正确的平方,如:
sq = fnc(r,c);
sq = fnc(1,3);
sq = 11;
您只需计算 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 答案中所述,使用内联函数会更好。
如果你的棋盘总是 8x8,你可以看到每个 r
从 0, 8, 16...开始,每个 c
只是从这些初始点开始的偏移量,所以给出一个r
和c
,可以通过board[(r * 8) + c]
计算数组索引得到对应的片
最好使用二维数组来解决这个问题,因为这样您就可以简单地访问 board[r][c]
.
如果你(或你的教授)坚持一维数组,这个宏会做你想做的事:
#define GET_PIECE(r, c) (board[((c) + (8) * (r))])
注意所有内容是如何用括号括起来的。 This is very important with macros!
更好的解决方案是使用 inline function.