我是C++
编程新手并编写了此C++
代码:
//colpitts high freq 1 GHz working with delay
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
const double pi = 3.1415926;
int main(){
double c0, dx, dt,C1,C2,L,fs,Ceq, freq, tau, Rload, gload, Re, ge,gm,gc1,gc2,ic1,ic2,il,gl ;
c0=20000000000;
dx=0.01;
dt=dx/(2 * c0);
cout<<dt<<"\n";
double V1 [1000000]={};
double V2 [1000000]={};
V1[0]=1e-3;
C1=1e-12;
C2=5e-12;
L=30.4e-9;
fs=4e12;
Ceq=(C1 * C2)/(C1+C2);
cout<<Ceq<<"\n";
freq=1/(2 * pi * (sqrt(L*Ceq)));
cout<<freq<<"\n";
tau=1/freq;
cout<<tau<<"\n";
Rload=50;
Re=1e6;
ge=1/Re;
cout<<ge<<"\n";
gm=0;
gc1=(C1)/dt;
cout<<gc1<<"\n";
ic1=-((C1)/dt) * V1[0];
cout<<ic1<<"\n";
gc2=(C2)/dt;
cout<<gc2<<"\n";
ic2=-((C2)/dt) * V2[0];
cout<<ic2<<"\n";
gl=dt/(L);
cout<<gl<<"\n";
il=gl * (V2[0]-V1[0]);
cout<<il<<"\n";
gload=1/Rload;
cout<<gload<<"\n";
return (0);
}
当我在Linux机器上运行时,它会抛出分段错误(核心转储)错误,但是当我将数组更改为100000时,不会抛出错误并且程序按预期执行。我知道问题在于分配给我的物理内存,但有没有办法绕过它?有人可以指导一下我需要带哪些修改吗?
答案 0 :(得分:2)
这是堆栈。您正在使用大约16Mb的堆栈来存储这两个双精度数组(每个双8字节* 2个数组* 1,000,000)。
像这样设置一个更大的堆栈:
ulimit -s 32000
修复问题。但是将16Mb数据块放在堆栈上并不是一个好主意。
如果你将它们从堆栈中移出(并使用一些空行以使代码更易于阅读:))那么它可以正常工作。但是,如上所述,我还建议你看一下 vector ,而不是使用C风格的原始数组:
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
const double pi = 3.1415926;
double V1 [1000000]={};
double V2 [1000000]={};
int main(){
double c0, dx, dt,C1,C2,L,fs,Ceq;
double freq, tau, Rload, gload;
double Re, ge,gm,gc1,gc2,ic1,ic2,il,gl ;
c0=20000000000;
dx=0.01;
dt=dx/(2 * c0);
cout<<dt<<"\n";
V1[0]=1e-3;
C1=1e-12;
C2=5e-12;
L=30.4e-9;
fs=4e12;
Ceq=(C1 * C2)/(C1+C2);
cout<<Ceq<<"\n";
freq=1/(2 * pi * (sqrt(L*Ceq)));
cout<<freq<<"\n";
tau=1/freq;
cout<<tau<<"\n";
Rload=50;
Re=1e6;
ge=1/Re;
cout<<ge<<"\n";
gm=0;
gc1=(C1)/dt;
cout<<gc1<<"\n";
ic1=-((C1)/dt) * V1[0];
cout<<ic1<<"\n";
gc2=(C2)/dt;
cout<<gc2<<"\n";
ic2=-((C2)/dt) * V2[0];
cout<<ic2<<"\n";
gl=dt/(L);
cout<<gl<<"\n";
il=gl * (V2[0]-V1[0]);
cout<<il<<"\n";
gload=1/Rload;
cout<<gload<<"\n";
return (0);
}
答案 1 :(得分:1)
他建议将那些本地数组声明全局,静态,动态分配意味着这些变量不会使用堆栈空间。使用STL中的矢量也可以。
此链接可以让您了解堆栈空间大小。
https://stackoverflow.com/a/1825996/3813353
一个快速而肮脏的解决方案是使用limit / ulimit。缺点是您必须在运行程序之前使用此命令。简单地使阵列全局变得更容易......
通常,当您遇到堆栈大小问题时,您是否有失控或无限递归。每次调用递归函数都可能不会使用堆栈中的大量数据,但如果函数不断调用自身,那么最终会耗尽堆栈空间。
答案 2 :(得分:1)
确实,你在堆栈上有太多的数据。
您可以使用std::vector标准模板类(即使您在堆栈上分配向量,其数据也在堆中)。因此,将#include <vector>
添加到包含的标题中,然后编写
std::vector<double> v1, v2;
v1.push_back(2.512);
v1.push_back(3.17);
v2.resize(37);
v2[0] = v1[0] + v1[1];
v2[17] = sqrt(10.0) + 11.0;
阅读一些STL tutorial;顺便说一下,使用和学习C ++ 11(不是早期的C ++标准)。因此,使用最新的编译器(例如GCC 4.9,使用g++ -std=c++11 -Wall -g
编译它....)并使用gdb
调试器。