2014-07-09 80 views
1

我是新來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時,不會引發錯誤,並且程序按預期執行。我知道問題是分配給我的物理內存,但是會有解決方法嗎?有人可以引導我,我需要引入什麼修改?

+4

當然。您需要在調試器中運行您的程序。在Linux上,這可能意味着gdb。 –

+5

V1和V2太大,你有一個堆棧溢出。你需要讓它們成爲全局的,或者靜態的,或者更好的,動態分配它們。 –

+2

'我知道問題是分配給我的物理內存'這不是問題。使用'std :: vector '而不是那些數組。 – PaulMcKenzie

回答

2

這是堆棧。您正在使用大約16Mb的堆棧來存儲這兩個雙精度數組(每個double * 2數組8個字節* 1,000,000)。

設置這樣一個更大的堆棧:

ulimit -s 32000 

是否解決問題。但是將16Mb數據塊放在堆棧上並不是一個好主意。

如果你像這樣將它們從堆棧中移出(並使用一些空行來使代碼更易於閱讀:)),那麼它工作正常。不過我也建議,如上面提到的,你看看矢量,而不是使用C風格的原始數組:

http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/C-Tutorial-A-Beginners-Guide-to-stdvector-Part-1.htm

#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); 
} 
+0

謝謝,這肯定會有助於讓我的代碼組織良好。 –

+0

另外,PI是爲您定義的。在頂部添加此項,您可以使用M_PI: #define _USE_MATH_DEFINES #include JCx

+0

什麼是默認堆棧大小? – sherrellbc

1

保羅·R是正確的。在函數中聲明的變量使用「堆棧」。你可以使用多少空間來限制局部變量。

他建議讓這些局部數組聲明爲全局,靜態,動態分配意味着這些變量不會使用堆棧空間。使用STL的vector也可以。

此鏈接可能會給你一個關於堆棧空間大小的想法。

https://stackoverflow.com/a/1825996/3813353

一個快速和骯髒的解決方案是使用限制/的ulimit。缺點是在運行程序之前必須使用此命令。簡單地使陣列全球化更容易...

通常,當您遇到堆棧大小的問題,是你有失控或無限遞歸。對遞歸函數的每次調用可能不會使用堆棧中的太多數據,但是如果函數繼續調用它自己,則最終會耗盡堆棧空間。

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調試器。