难以理解的分割错误与c++
Unintelligible Segmentation Fault with C++
void Update_Structure_Factor ()
{
double Ssin [121][121][121];
double Scos [121][121][121];
double kdotr;
int ik;
double Sk_ [66];
int howmany [66];
for ( int i=0; i<x_.size(); ++i )
{
for ( int k1=0; k1<=120; ++k1 )
{
for ( int k2=0; k2<=120; ++k2 )
{
for ( int k3=0; k3<=120; ++k3 )
{
kdotr = (double)dQ*( (k1-60)*x_[i][0] + (k2-60)*x_[i][1] + (k3-60)*x_[i][1] );
Ssin[k1][k2][k3] += (double)sin(kdotr);
Scos[k1][k2][k3] += (double)cos(kdotr);
}
}
}
}
for ( int k1=0; k1<=120; ++k1 )
{
for ( int k2=0; k2<=120; ++k2 )
{
for ( int k3=0; k3<=120; ++k3 )
{
double k = (double)dQ*sqrt( pow((k1-60),2) + pow((k2-60),2) + pow((k3-60),2) );
ik = round(k/0.1);
Sk_[ik] += Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3];
++howmany[ik];
}
}
}
for ( int i=0; i<66; ++i )
Sk[i] += (double)Sk_[i]/howmany[i];
}
第34行导致问题,即Sk_[ik] += Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3];
"有趣"的事情是,如果我用,比如说,2代替Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3]
,它工作。
,请帮助!
注:: x_
和Sk
是Update_Structure_Factor
方法所属类的成员
您在这里的堆栈上放置了大量的数据—Ssin和Scos各约14MB。虽然不知道您正在使用哪个c++编译器或目标硬件,但我认为与堆栈滥用有关的事情是合理的猜测。几乎可以肯定,最好将这些数组设置为静态(线程不安全)或从堆中分配。
无关,但c++不会自动为您初始化堆栈变量。您的代码假设数组以零开始。将数组设置为静态实际上会在第一次执行0 init,但是必须在每次调用时再次清除它们。
好的,我找到了一种不使用static
关键字而使代码工作的替代方法。我只是采样了k1
、k2
和k3
的一半,即使它们仍然覆盖了我感兴趣的整个领域(即ik
从0到65)。这样,我没有得到分割错误的错误,但程序在合理的时间内工作。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'