我必须遍历2d数组的每个索引,找到邻居值是什么,然后根据它更新数组的索引。我的代码完成了所有这些,但是当我必须更新数组时,它会更新现有数组,因此下一个索引会产生不正确的输出。我尝试创建一个新数组,但是当我使用新数组时,没有任何更新,它保持不变。这就是我现在所拥有的。
void ch(int **b, int w, int h)
{
int x,y,i,ct=0;
int **up;
up=malloc(sizeof(int *) * h);
for(i = 0; i<h; i++){
up[i]=malloc(sizeof(int)*w);
}
for (x=0;x<h;x++)
{
for(y=0;y<w;y++)
{
//...Computes Count Here(It Works)
//UPDATE BOARD - Does not update the board
if(b[x][y]==1 && ct<2)
{
up[x][y]=0;
}
else if(b[x][y]==1 && (ct==2 || ct==3))
{
up[x][y]=1;
}
else if(b[x][y]==1 && ct>3)
{
up[x][y]=0;
}
else if(b[x][y]==0 && ct==3)
{
up[x][y]=1;
}
ct=0;
}
}
b=up;
}
我尝试通过对自身进行更改来更新2d数组b并更改数组,但它不是我要查找的输出。它会在每次迭代时更改输出,因此其他索引的输出会发生变化,但我希望它能让另一个数组跟踪输出,这样它就不会在每次迭代时更新b并给出正确的输出。我做错了什么不让我更新?解决这个问题的最佳方法是什么?
答案 0 :(得分:0)
C按值传递参数。
所以你可以这样做
int* pass(int *p){
//return new pointer; and later assign
}
或获取地址
void pass(int **p)
{
*p=//new pointer
}
根据您的情况,最好在不分配新内容的情况下修改同一个数组
我无法修改相同的数组
您可以按照建议处理数组副本,然后从副本
更新以前的数组或者按照我的建议返回复制的数组
值得一看:
答案 1 :(得分:0)
制作原始数组的副本并将其用作参考。然后,您可以直接更新原始数组。
void ch(int **b)
{
int **up = malloc(sizeof(*int)*h);
int i;
for (i = 0; i < w; i++)
{
up[i] = malloc(sizeof(int) * w);
memcpy(up[i], b[i], w * sizeof(int));
}
//
if (up[x][y] == 1)
b[x][y] = 0;
}
// free up
这可能比在
中具有额外的间接级别更容易维护void ch(int ***b)
{
int **up = *b;
// do everything else as you intended
// finalize with
*b = up;
// free up
}
同样在制作副本时,您可以通过将临时副本分配为线性数组来稍微提高性能
int *up = malloc(sizeof(int) * w * h);
if (up[y * w + x] == 0)
b[y][x] = 1;
答案 2 :(得分:0)
在功能结束时,如果您有b=up;
,则设置b
指向新阵列,但这只会更改您的功能副本(b
)而不是调用函数中的副本...所以调用者仍然可以看到原始数组。
但是,由于您使用指向数组的指针数组而不是实际的2D数组,因此可以替换b
的内容 (构成附加维度的数组的int *
)......这将避免将所有新数组的数据复制到原始数组中。
所以而不是:
b=up;
尝试:
for(i = 0; i < h; i++) {
free(b[i]);
b[i] = up[i];
}
free(up);
这样,通过更改原始行数组中的指针,原始数组的每一行都会被新行中的相应行替换。
然而,这只是一个好主意,如果原始数组的行是动态分配的,就像新数组中的行一样,并且如果没有其他指针指向浮动的行(行数组之外)传递为b
),之后可能仍然指向旧的记忆。