gpt4 book ai didi

C中的坐标系作为数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:34 24 4
gpt4 key购买 nike

我有一个固定宽度的坐标系

#define gridSize 101
int _map[gridSize][gridSize];

因为我得到的某些 x y 坐标的值范围从 -50 到 50,所以我想用例如 map[0][0] 作为指向 的坐标原点来调用我的 map _ map [51][51]。换句话说,如果我从源中获取 x y 的值并想将其添加到我的 map 中,我想调用

map[x][y] = value

而真正得到值的是

_map[51+x][51+y] = value

所以我必须创建一个指针,但我不确定如何在多维数组中执行此操作。

#define gridSize 101 // must be an odd number for origin of ordinates in center
#define gridSizeCenter = (int)(gridSize/2)+1;
int _map[gridSize][gridSize];
int map[gridSize][gridSize];
map = &_map[gridSizeCenter][gridSizeCenter]; // wont work

最后一行代码是错误的。我该怎么做才正确?

最佳答案

是的,你可以!

我不认为你可以用数组做到这一点,但你可以用指向数组元素的指针来做到这一点。

但是,除非有充分的理由,否则我不会这样做。负索引指针不会是阅读您的代码的人所期望的,因此很容易被意外误用。为清楚起见,您最好使用基于函数的解决方案 - 除非它需要非常快。

既然如此,让我们开始吧!

从您的尝试来看,您似乎对数组和指针感到困惑。记住,他们are not the same thing .

现在,C 不会阻止您使用负索引,which can make sense when you're using a pointer .所以,你可以这样做:

 int a[5]; 
int *b = a + 2; // or &a[2]

b[-2] // is a[0]
b[-1] // is a[1]
b[0] // ia a[2], etc

所以,我认为以下代码适合您。

#define GRIDSIZE 101

.....


int map_memory[GRIDSIZE][GRIDSIZE];
int *map_rows[GRIDSIZE];
int **map;
int i;

int gridMidPoint = GRIDSIZE / 2;

for(i = 0; i < GRIDSIZE; i++) {
map_rows[i] = &(map_memory[i][0]) + gridMidPoint;
}
map = map_rows + gridMidPoint;

然后您可以完全按照您的预期使用它 - 网格大小为 101:

for(i = -50; i <= 50; i++) {
for(j = -50; j <= 50; j++) {
map[i][j] = i+j;
}
}

或者,更一般地说:

for(i = -1 * gridMidPoint; i <= gridMidPoint; i++) {
for(j = -1 * gridMidPoint; j <= gridMidPoint; j++) {
map[i][j] = i+j;
}
}

因为两个数组都是在堆栈上创建的,所以不需要释放任何东西。


这里发生了什么?让我分解一下。首先,我们创建支持数组:

int map_memory[GRIDSIZE][GRIDSIZE]; 

接下来,我们需要一个指针数组,我们将使用这些指针作为我们的行:

int *map_rows[GRIDSIZE];

我们需要这些是指针,因为它们将指向我们刚刚创建的二维数组中的数组中间。

int gridMidPoint = GRIDSIZE / 2;

这里我们计算中点。我假设您希望零的每一侧都有相同数量的数组元素 - 因此您不需要示例中的 +1。

for(i = 0; i < GRIDSIZE; i++) {
map_rows[i] = &(map_memory[i][0]) + gridMidPoint;
}

此代码遍历行数组中的每个元素,并将该行设置为指向二维数组中相关行的中间。你也可以这样写:

    map_rows[i] = &map_memory[i][gridMidPoint];

但我个人认为带有多余括号和添加的版本更易读。我认为如果你用指针做一些不寻常的事情,你应该为下一个阅读你代码的人清楚地说明发生了什么。

最后,我们需要我们的 map 指针指向行的中间:

map = map_rows + gridMidPoint;

我们完成了!


请记住,二维数组实际上是一 block 连续的内存。这意味着 map[0][gridMidPoint+1]map[1][-1*gridMidPoint] 的位置相同。这实际上与普通的二维数组没有什么不同,但在调试时需要注意这一点。

关于C中的坐标系作为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11048342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com