作为非编码的专家,我敢于开始编写代码。代码的初步版本按预期工作(当符合gcc -lm时)。但是,当我试图用编译器的-fopenmp选项编译它时,因为我想让代码的某些部分并行,代码崩溃 - 分段错误。我想强调一点,我还没有引入任何编译指示 - 我只是使用-fopenmp选项进行编译,代码崩溃了。但是,当我尝试在不同的Linux机器上运行此代码时 - 它可以工作。
我尝试使用调试器来查看代码的哪个位置发生了分段错误。当我尝试在函数中重新分配之前在main()中分配的结构时,似乎问题就开始了。
这是结构:
typedef struct
{
Bond bond; // structure bond
int f; // the lenghth of the fragment
int *fragment;
} Fragment;
首先,我在main()中分配它并将其传递给函数:
Fragment fragments3[NBONDS];
for (i=0;i<NBONDS;i++) {
fragments3[i].fragment = malloc (1*sizeof(int));
fragments3[i].f = 0;
fragments3[i].bond = bonds[i];
}
// to fill up the allocated fragments with the values
fragmentation(coordinates, NATOMS, NBONDS, bonds, fragments3);
然后当我在函数碎片中开始使用这个已分配的结构数组时,会发生分段错误:
void fragmentation(Atom *coordinates, int NATOMS, int NBONDS, Bond *bonds, Fragment *fragments3) {
int mm, i, ll, j;
for (mm=0;mm<NBONDS;mm++) {
(fragments3)[mm].bond.atom1 = bonds[mm].atom1; (fragments3)[mm].bond.atom1 = bonds[mm].atom1;
for (i=0;i<coordinates[bonds[mm].atom1-1].nn;i++) {
if (coordinates[bonds[mm].atom1-1].n[i] != bonds[mm].atom2) {
(fragments3)[mm].fragment[(fragments3)[mm].f]= coordinates[bonds[mm].atom1-1].n[i];
(fragments3)[mm].f= (fragments3)[mm].f + 1;
(fragments3)[mm].fragment = (int *) realloc( (fragments3)[mm].fragment, ((fragments3)[mm].f+1)*sizeof(int) ) ;
}
}
}
.......
}
任何提示或建议都会有所帮助。我必须强调,当我在main中分配时会发生同样的崩溃:
Fragment **fragments3 = malloc(NBONDS * sizeof (*fragments3));
...
fragmentation(coordinates, NATOMS, NBONDS, bonds, &fragments3);
并在函数中使用它:
(*fragments3).f = ...
是的,当然,这些是结构:
typedef struct {
char El[3];
double xyz[3];
int t;
int n[23];
int nn;
} Atom;
typedef struct {
int atom1;
int atom2;
int angle;
} Bond;
在主要内容中,我通过以下方式启动它们:
Atom *coordinates = malloc(1 * sizeof *coordinates);
Bond *bonds = malloc(1*sizeof *bonds);
(以后这些是通过功能填写的)
答案 0 :(得分:0)
在遵循建议检查每个malloc分配时,我在代码中发现了一个错误。问题出在结构坐标上,即坐标中。关键是我用这个变量计算:coordinates.n ++。由于我在开头没有输入0,所以我得到了一些奇怪的数字,整个事情都出了问题。
但为了得到它,我必须检查1000行代码..
再次感谢你!