为什么我的代码会抛出SIGBUS错误,即使我将变量存储在堆中也是如此



Antenna类的方法plotThermalNoise()中,由于某些原因,for循环没有运行。最初,我将int用于ni,但我需要使用比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表示_srate0.000001表示_sdurn变为4,000,000,000 / 0.000,000,1 == 4,000,000,000,000,000

然后尝试在堆栈上分配两个相同大小的double数组。这些阵列的总大小为64 PB字节。

目前存在的最大的超级计算机具有;超过10PiB的存储器";。所以你只需要比它大6倍的东西。

我似乎收到了一个SIGBUS错误。

如您所愿。一些粗略的计算应该可以帮助您认识到,代码编译并不意味着它会运行。

即使我将变量存储在堆中?

除非你真的有一台RAM超过64PiB的计算机,否则堆栈与堆是无关紧要的——两者都会用完。

相关内容

  • 没有找到相关文章

最新更新