0

古いものと新しいものの2つの2Dアレイを交換しようとしています。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

配列のポインタ値を変更することはできません。4つの変数が必要です。

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]場合に使用します。1D配列で計算を実行してもかまわない場合は、を渡すだけですfloat*

于 2013-02-04T19:45:06.933 に答える
0

配列を交換する代わりに、これらの配列へのポインタを交換する必要があります。アレイを直接交換する場合は、その内容をコピーする必要があります(memcpyたとえば)。

于 2013-02-04T19:45:16.130 に答える