我试图得到一个数学结果,但我继续得到一个分段错误,分段错误发生在“cout”行。我认为r []数组或LJ []数组没有任何错误。
for (k = 0; k < 15; k++)
{
for (i = 0; i < 15; i++)
{
if (i == k)
{
NULL;
}
else
{
//Use the 3D distance formula
term1 = fabs(x[k] - x[i]);
term1 = pow(term1, 2);
term2 = fabs(y[k] - z[i]);
term2 = pow(term2, 2);
term3 = fabs(z[k] - z[i]);
term3 = pow(term3, 2);
result = term1 + term2 + term3;
result = sqrt(result);
r[h] = result; //Store the result in an array
h++;
}
}
}
//Calculate Lennard-Jones potential of every pair
for(itr = 0; itr < 210; itr++)
{
term1 = pow(r[itr], 12);
term1 = 1/term1;
term2 = pow(r[itr], 6);
term2 = 2/term2;
LJ[itr] = term1 - term2;
}
double Ei;
for(itr = 0; itr < 210; itr++)
{
Ei = LJ[itr] + Ei;
}
Ei = Ei/2;
cout << "The new Energy level " << Ei << endl;
答案 0 :(得分:0)
我认为你的内存损坏行
Ei = LJ[itr] + Ei;
在执行cout获取位置时会生成段错误。
答案 1 :(得分:0)
更新:您已更新LJ的定义,因此不再是此问题。 既然这是c ++,你为什么要使用循环和索引?更好(如:更安全)的解决方案是使用标准库算法,尤其是accumulate。 通过这样做,您将获得清晰度并可能删除段错误的来源。
除非其他要求限制您,否则您应该遵循Scott Meyer的advice优先于循环算法。
第二次更新,整个代码可用:您必须确保只访问正确分配的内存位置。所以:
更好的是,删除所有那些神奇的数字,而不是210使用k_max *(j_max - 1)并定义
const unsigned int k_max = 15;
const unsigned int j_max = 15;
使用std :: vector而不是数组,这将为您处理内存分配。
打印h和itr的值(或使用调试器,这是一个非常有用的工具)将显示您访问未保留的内存的位置。