如何解决即使将变量存储在堆中,为什么我的代码也会引发SIGBUS错误?
在plotThermalNoise()
类的方法Antenna
中,由于某些原因,for
循环未运行。最初,我将int
用于n
和i
,但是我需要处理比int
更大的数字。所以,现在我都使用long int
两者。但是,该程序不再起作用。我使用GDB逐步解决了这个问题,看来我遇到了SIGBUS错误。我尝试使用new
以便将两个变量都存储在堆中,但是循环仍然无法运行。
#define k 0.0000000000000000000000138064852 //Boltzmann's constant
class Antenna{
double _srate,_sdur,_res,_temp,_band;
public:
Antenna(double sampling_rate,double sample_duration,double resistance_ohms,double temperature_kelvin,double bandwidth_Hz){
_srate = sampling_rate; _sdur = sample_duration;
_res = resistance_ohms; _temp = temperature_kelvin;
_band = bandwidth_Hz;
}
void plotThermalNoise();
};
void Antenna::plotThermalNoise(){
//calculate RMS,mean of Gaussian
double RMS = sqrt(4 * _res * k * _temp * _band);
double V = sqrt((4 * k * _temp * _band) / _res);
long int n = _srate / _sdur;
double x[*n],y[*n];
gRandom->SetSeed(time(NULL));
for(long int i = 0; i < n; ++i){
x[i] = i;
y[i] = gRandom->Gaus(V,RMS);
}
TGraph gr = new TGraph(n,x,y);
gr->SetTitle("Thermal Noise Voltage vs Time Trace;Seconds;Volts");
gr->Draw();
}
void dataAquisitionSim(){
Antenna test(4000000000,0.000001,50,90,500);
test.plotThermalNoise();
}
解决方法
long int n = _srate / _sdur;
double x[*n],y[*n];
此代码将无法编译。我假设您的实际代码是:
long int n = _srate / _sdur;
double x[n],y[n];
使用您传入的参数:4000000000
的{{1}}和_srate
的{{1}},0.000001
变成_sdur
。
然后,您尝试在堆栈上分配两个该大小的n
数组。这些数组的总大小为64个 peta 个字节。
最大的超级计算机currently in existence具有“超过10PiB的内存”。因此,您只需要比它大六倍的东西。
似乎我遇到了SIGBUS错误。
应该应该。进行一些封底计算可以帮助您认识到,仅仅因为您的代码编译并不意味着它将运行。
即使我将变量存储在堆中?
除非您实际上有一台具有超过64PiB RAM的计算机,否则堆栈与堆无关紧要-两者都将用光。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。