我是
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时,不会抛出错误并且程序按预期执行。我知道问题出在分配给我的物理内存上,但是有办法解决吗?有人可以指导我需要进行哪些修改吗?
它是堆栈。您正在使用大约 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);
}
保罗 R 是对的。函数内声明的变量使用“堆栈”。局部变量可以使用的空间是有限制的。
他建议将这些本地数组声明设为全局、静态、动态分配,这意味着这些变量将不会使用堆栈空间。使用 STL 中的矢量也可以。
此链接可能会让您了解堆栈空间大小。
https://stackoverflow.com/a/1825996/3813353
一种快速而肮脏的解决方案是使用 limit/ulimit。缺点是您必须在运行程序之前使用此命令。简单地使数组全局变得更容易......
通常,当你遇到堆栈大小问题时,是因为你有失控或无限递归。对递归函数的每次调用可能不会使用堆栈中的太多数据,但如果函数不断调用自身,您最终将耗尽堆栈空间。
确实,堆栈上的数据太多了。
您可以使用 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教程;顺便说一句,使用和学习 C++11(不是一些早期的 C++ 标准)。因此,请使用最新的编译器(例如 GCC 4.9,使用
g++ -std=c++11 -Wall -g
.... 进行编译)并使用 gdb
调试器。