2011-11-22 54 views
0

我试图得到一个数学结果,但我一直在获取分段错误,分段错误发生在“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; 
+4

seg-fault当然不在'cout'行(除非你真的做了一件真正的事情,'cout'真的很糟糕,我无法想象:D)。 LJ如何定义? –

+0

double LJ [210]; – Josh

+1

然后还有别的东西。粘贴更多代码。 –

回答

0

更新:您已经更新了LJ的定义,所以这不再是问题。 既然这是C++,为什么你使用循环和索引?更好的(如:更安全)解决方案将使用标准库算法,特别是使用accumulate。 通过这样做,你会增加清晰度可能删除段错误的来源。

除非其他要求限制您,否则您应该遵循Scott Meyer的advice偏爱循环算法。

第二次更新,整个代码可用:您必须确保您只访问您正确分配的内存位置。所以:

  1. 确保H是零和
  2. ,你永远不会写于R [210]和较高的初始化。

更重要的是,删除所有这些神奇数字,而不是210使用k_max *(j_max - 1),并定义

const unsigned int k_max = 15; 
const unsigned int j_max = 15; 

用std :: vector的,而不是一个数组,这会照顾的内存分配给你。

打印h和itr(或使用调试器,这是一个非常有用的工具)的值会告诉你你正在访问的内存,你没有保留。

+0

我还没有完成编程,我可以试试 – Josh

+0

好吧即时尝试它与矢量现在 – Josh

+0

好吧,并检查出太多,因为问题可能是你计算一个太多或一个太少的元素在第一个循环。因此:避开循环(或者加倍确定你的界限是正确的)。 – Francesco

0

我认为你必须排队

Ei = LJ[itr] + Ei; 

其中产生段错误后,当COUT的执行取得一席之地内存损坏。

+0

为什么要添加那个错误? – Josh

+0

@Josh - 这不是加法,它是对'LJ [itr]'的访问。 –

+0

这种情况下的内存损坏是int LJ [itr],而不是执行+运算符。所以我想你的数据写在LJ数组之外。 – AlexTheo