0

我正在尝试交换两个新旧二维数组。我想调用一个函数copyNewToOld,而不实际复制值。我只想对旧的引用指向新的位置,对新的引用指向旧的。

所以我可以这样初始化:

float oldMesh[SIZE][SIZE] = {0};
float newMesh[SIZE][SIZE] = {0};

像这样调用:

copyNewToOld(&newMesh, &oldMesh);

并以这样的方式实现:

void copyNewToOld(float *(new[][SIZE]), float *(old[][SIZE])){
    float **temp;
    temp = *new;
    *new = *old;
    *old = temp;
    temp = NULL;
}

但是,该实现不会交换指针,我只是继续一遍又一遍地覆盖数据。

我是否错过了一些直截了当的东西?

更新代码:

float oldMesh[DIM + 2][DIM + 2] = {0};
float newMesh[DIM + 2][DIM + 2] = {0};
float **newTemp, **oldTemp
for(i = 0; i < iterations; i++){
  newTemp = &newMesh;
  oldTemp = &oldMesh;
  copyNewToOld(&newTemp, &oldTemp);
  calculateNew(newMesh, oldMesh, xsource, ysource);
}

与 copyNewToOld 为:

void copyNewToOld(float ***new, float ***old){
  float **temp;
  temp = *new;
  *new = *old;
  *old = temp;
}
4

2 回答 2

2

您不能更改数组的指针值。您将需要四个变量:

float oldmesh[SIZE][SIZE];
float newmesh[SIZE][SIZE];
float *oldMesh = (float*) oldmesh;
float *newMesh = (float*) newmesh;
void copyNewToOld( float **old, float **new ){
    float *temp = *old;
    *old = *new;
    *new = temp;
}
...
{
    copyNewToOld( &oldMesh, &newMesh );
}

修复您的代码:

float oldMesh[DIM + 2][DIM + 2] = {0};
float newMesh[DIM + 2][DIM + 2] = {0};
float *newTemp, *oldTemp
newTemp = (float*) newMesh;
oldTemp = (float*) oldMesh;
for(i = 0; i < iterations; i++){
  copyNewToOld(&newTemp, &oldTemp);
  calculateNew((float(*)[DIM + 2])newTemp, (float(*)[DIM + 2])oldTemp, xsource, ysource);
}

(演员表是为了如果你想让calculateNew函数接收一个float[DIM + 2][DIM + 2]。如果你不介意在一维数组上做数学,只需传入float*

于 2013-02-04T19:45:06.933 回答
0

与其交换数组,不如交换指向这些数组的指针。如果要直接交换数组,则必须复制它们的内容(memcpy例如)。

于 2013-02-04T19:45:16.130 回答