假设我有一个随机布尔值的二维数组和一个名为“网格”的零,我有一个名为“list”的一维数组,它列出了二维数组中所有零的地址。这是数组的定义方式:
define n 100
bool lattice[n][n];
bool *list[n*n];
用1和0填充晶格后,我将列的地址存储在列表中:
for(j = 0; j < n; j++)
{
for(i = 0; i < n; i++)
{
if(!lattice[i][j]) // if element = 0
{
list[site_num] = &lattice[i][j]; // store address of zero
site_num++;
}
}
}
如何提取数组中每个零点的x,y坐标?换句话说,有没有办法通过引用它的地址来返回数组元素的索引?
编辑:我需要尽可能提高代码的效率,因为我正在做很多其他复杂的事情和更大的数组。因此,实现这一目标的快速方法将是很好的
答案 0 :(得分:1)
一种解决方案是将(x, y)
映射到自然数(例如z
)。
z = N * x + y x = z / N (integer division) y = z % N
在这种情况下,您应该使用int list[N * N];
另一个解决方案是在找到零时存储坐标,例如:
list_x[site_num] = x; list_y[site_num] = y; site_num++;
或者您可以定义两个int
的结构。
答案 1 :(得分:1)
嗯,可以使用一些指针算法。
您拥有第一个格子元素的地址和列表中所有零字段的地址。你知道布尔的大小。通过从零字段地址中减去第一个元素地址并除以bool的大小,您将得到一个linar索引。可以使用模和除法将此线性指数计算为2-dim指数。
但是为什么不在列表中存储2-dim索引而不是地址?你需要addess还是只需要索引?
你应该考虑转动for循环(外循环i,内循环j)。
答案 2 :(得分:0)
struct ListCoords
{
int x, y;
} coords[n*n];
for(i = 0; i < site_num; i++)
{
int index = list[i] - &lattice[0][0];
coords[i].x = index % n;
coords[i].y = index / n;
}
我可能会根据您的需要提供%和/运算符,但这应该会给您提供这个想法。
答案 3 :(得分:-1)
如何提取数组中每个零点的x,y坐标?换句话说,有没有办法通过引用它的地址来返回数组元素的索引?
你不能。就那么简单。如果您需要该信息,则需要将其与相关数组一起传递。
bool *list[n*n];
是C89中的非法声明(编辑:除非你做了一个宏(哎呀!)),你可能希望注意到可变长度数组是C99特征。