2012-12-17 57 views
0

我在OpenMP中使用了一個結構數組,但它失敗了,而我使用了多維數組,它給了我正確的結果。我想知道爲什麼。使用的結構的
定義:OpenMP中的多維數組和數組結構

struct loc ( 

float **mig; 

} 

loc *Loc = new loc[nthread]; 
for(i=0; i<nthread; i++) 
{ 
    Loc[i].mig = new float*[nx]; 
    for(j=0; j<nx; j++) 
    { 
     Loc[i].mig = new float[ny]; 
    }  
} 

祿並行段共享和使用TID訪問。
該實施失敗。

比以前多維數組:

float ***mig; 
mig = new float**[nthread]; 
for(i=0; i<nthread; i++) 
{ 
    mig[i] = new float*[nx]; 
    for(j=0; j<nx; j++) 
    { 
      mig[i][j] = new float[ny]; 
    } 
} 

MIG在平行部分共享。這個實現工作。這裏使用tid作爲第一維來訪問2D mig。

在這兩種情況下,mig數組並行填充爲子句。

第一種情況未能給出分段錯誤,但第二種情況正在成功執行,給出正確的輸出。

由於mig必須由本機C代碼賦值,因此不使用向量。

請幫助我理解兩者之間的區別。

+0

是你不使用'std :: vector >'??? –

+0

你不能認真對待這個'float *** mig;'???典型的新手指針濫用是完全不必要和不必要的。 STAHP。只要去學習適當的C++。 –

+0

第一個版本應該包含'loc * Loc = new loc [nthread];' –

回答

0

你的錯誤似乎是...

for(i=0; i<nthread; i++) 
{ 
    Loc[i].mig = new float*[nx]; 
    for(j=0; j<nx; j++) 
    { 
     Loc[i].mig = new float[ny]; 
     //  ^------------------------ right here 
    } 
} 

你必須在最內層循環一個錯字。而應該這樣寫:

for(j=0; j<nx; j++) 
{ 
    Loc[i].mig[j] = new float[ny]; 
} 

應該不是C++警告從float *float **隱式轉換?