0

我在 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];  
    }    
}  

Loc 在并行部分中共享,并使用 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 数组都是并行填充的 for 子句。

第一种情况未能给出分段错误,但第二种情况正在成功执行,给出正确的输出。

由于必须从本机 C 代码中为 mig 赋值,因此不使用向量。

请帮助我了解两者之间的区别。

4

1 回答 1

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 *to的隐式转换float **吗?

于 2012-12-18T08:04:14.663 回答