如何以二维方式导航一维数组?
How to navigate a 1d array in a 2d manner?
我在下面得到了这个示例代码。我知道细胞是以一维方式制作的,
因为编译器在 1d 中逐行将 2d 数组存储在内存中。我没有 understand/can 想不到的是如何访问元素或更改位置。
我知道 board->cells[i + (20 * (10 - 1))] = FLAG_WALL;
用于为最底部的行设置标志。从格式上看,它似乎在使用公式,但我不确定它是什么。左右边缘的公式似乎也发生了变化。
(board->cells[i * 20 + 20 - 1] = FLAG_WALL;
)
查看 board->cells[20 * 2 + 2] = FLAG_SNAKE;
行,cell[42] 似乎是产生蛇旗的地方。算术将其位置向上、向下、向右、向左移动 1 个单元格会是什么样子?当将单元格 [42] 想象为内存中一维数组的一部分时,我无法计算出算术运算,也无法计算出移位后的结果单元格编号,例如 'up'.
board_init_status_t initialize_default_board(board_t* board) {
board->width = 20;
board->height = 10;
board->cells = calloc(20 * 10, sizeof(int));
// Set edge cells!
// Top and bottom edges:
for (int i = 0; i < 20; ++i) {
board->cells[i] = FLAG_WALL;
board->cells[i + (20 * (10 - 1))] = FLAG_WALL;
}
// Left and right edges:
for (int i = 0; i < 10; ++i) {
board->cells[i * 20] = FLAG_WALL;
board->cells[i * 20 + 20 - 1] = FLAG_WALL;
}
// Add snake
board->cells[20 * 2 + 2] = FLAG_SNAKE;
return INIT_SUCCESS;
}
将一维数组视为二维数组,最后一行的开头将位于 width * (height - 1)
位置,最后一行的最后一个单元格位于 width * height
双方的逻辑几乎相同。
board->cells[20 * 2 + 2] = FLAG_SNAKE;
表示它位于第 2 行的位置 2。或在 (x;y) 坐标 (2, 2) 中。这是纯数学。如果你想像二维数组一样在一维数组中移动,只需将一行的长度乘以你想要移动的行的索引(我们称之为 y
),然后将 x
添加到到达 x
单元格。
board_init_status_t initialize_default_board(board_t* board) {
board->width = 20;
board->height = 10;
board->cells = calloc(20 * 10, sizeof(int));
// Set edge cells!
// Top and bottom edges:
for (int i = 0; i < 20; ++i) {
board->cells[i] = FLAG_WALL; // [0, 19] (top row)
board->cells[i + (20 * (10 - 1))] = FLAG_WALL; // [180, 199] (bottom row)
}
// Left and right edges:
for (int i = 0; i < 10; ++i) {
board->cells[i * 20] = FLAG_WALL; // (left row)
board->cells[i * 20 + 20 - 1] = FLAG_WALL; // (right row)
}
// Add snake
board->cells[20 * 2 + 2] = FLAG_SNAKE;
return INIT_SUCCESS;
}
我在下面得到了这个示例代码。我知道细胞是以一维方式制作的, 因为编译器在 1d 中逐行将 2d 数组存储在内存中。我没有 understand/can 想不到的是如何访问元素或更改位置。
我知道
board->cells[i + (20 * (10 - 1))] = FLAG_WALL;
用于为最底部的行设置标志。从格式上看,它似乎在使用公式,但我不确定它是什么。左右边缘的公式似乎也发生了变化。 (board->cells[i * 20 + 20 - 1] = FLAG_WALL;
)查看
board->cells[20 * 2 + 2] = FLAG_SNAKE;
行,cell[42] 似乎是产生蛇旗的地方。算术将其位置向上、向下、向右、向左移动 1 个单元格会是什么样子?当将单元格 [42] 想象为内存中一维数组的一部分时,我无法计算出算术运算,也无法计算出移位后的结果单元格编号,例如 'up'.
board_init_status_t initialize_default_board(board_t* board) {
board->width = 20;
board->height = 10;
board->cells = calloc(20 * 10, sizeof(int));
// Set edge cells!
// Top and bottom edges:
for (int i = 0; i < 20; ++i) {
board->cells[i] = FLAG_WALL;
board->cells[i + (20 * (10 - 1))] = FLAG_WALL;
}
// Left and right edges:
for (int i = 0; i < 10; ++i) {
board->cells[i * 20] = FLAG_WALL;
board->cells[i * 20 + 20 - 1] = FLAG_WALL;
}
// Add snake
board->cells[20 * 2 + 2] = FLAG_SNAKE;
return INIT_SUCCESS;
}
将一维数组视为二维数组,最后一行的开头将位于
width * (height - 1)
位置,最后一行的最后一个单元格位于width * height
双方的逻辑几乎相同。board->cells[20 * 2 + 2] = FLAG_SNAKE;
表示它位于第 2 行的位置 2。或在 (x;y) 坐标 (2, 2) 中。这是纯数学。如果你想像二维数组一样在一维数组中移动,只需将一行的长度乘以你想要移动的行的索引(我们称之为y
),然后将x
添加到到达x
单元格。
board_init_status_t initialize_default_board(board_t* board) {
board->width = 20;
board->height = 10;
board->cells = calloc(20 * 10, sizeof(int));
// Set edge cells!
// Top and bottom edges:
for (int i = 0; i < 20; ++i) {
board->cells[i] = FLAG_WALL; // [0, 19] (top row)
board->cells[i + (20 * (10 - 1))] = FLAG_WALL; // [180, 199] (bottom row)
}
// Left and right edges:
for (int i = 0; i < 10; ++i) {
board->cells[i * 20] = FLAG_WALL; // (left row)
board->cells[i * 20 + 20 - 1] = FLAG_WALL; // (right row)
}
// Add snake
board->cells[20 * 2 + 2] = FLAG_SNAKE;
return INIT_SUCCESS;
}