2013-02-04 85 views
0

我想交換兩個2d陣列,舊的和新的。我想調用一個函數copyNewToOld,而不實際複製這些值。我只是想引用舊的指向新的位置,並指向新的指向舊的。功能交換2d陣列參考

所以我可以初始化這樣的:

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; 
} 
+0

好吧兩件事。其一,我有點誤會;二維數組降級爲float *,而不是float ** ...修復。其次,你需要在循環之前設置newTemp和oldTemp,並使用它們而不是* Mesh。通過修復您的代碼更新我的答案。 – Kaslai

回答

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*

+0

仍然沒有做交換......不知道我在做什麼錯,但我同意這個解決方案應該工作。 – jscott

+0

@Joe確保你沒有使用'oldmesh'和'newmesh'。使用'oldMesh'和'newMesh'。 – Kaslai

+0

是的,我使用了不同的名字(我不是那麼靠近)。他們仍然從未交換的功能回來。 – jscott

0

而不是交換數組,而應該交換指向這些數組的指針。 如果您想直接交換陣列,則必須複製其內容(例如使用memcpy)。