在Antenna
类的方法plotThermalNoise()
中,由于某些原因,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
表示_srate
,0.000001
表示_sdur
,n
变为4,000,000,000 / 0.000,000,1 == 4,000,000,000,000,000
。
然后尝试在堆栈上分配两个相同大小的double
数组。这些阵列的总大小为64 PB字节。
目前存在的最大的超级计算机具有;超过10PiB的存储器";。所以你只需要比它大6倍的东西。
我似乎收到了一个SIGBUS错误。
如您所愿。一些粗略的计算应该可以帮助您认识到,代码编译并不意味着它会运行。
即使我将变量存储在堆中?
除非你真的有一台RAM超过64PiB的计算机,否则堆栈与堆是无关紧要的——两者都会用完。