2015-09-24 58 views
3

我是一個新的C++,從matlab切換到更快地運行模擬。
我想初始化一個數組,並用零填充。用cpp初始化數組和用零填充

# include <iostream> 
# include <string> 
# include <cmath> 
using namespace std; 

int main() 
{ 
    int nSteps = 10000; 
    int nReal = 10; 
    double H[nSteps*nReal]; 
    return 0; 
} 

它產生一個錯誤:

expected constant expression  
cannot allocate an array of constant size 0  
'H' : unknown size 

你怎麼做這個簡單的事情?是否有一個命令庫,如MATLAB:

zeros(n); 
+5

'std :: vector H(nSteps * nReal);' – UmNyobe

+1

C風格的數組主要出於歷史原因,儘量避免它們。它們具有奇怪的行爲,例如不能在運行時設置大小,並導致堆棧溢出。 –

+1

將'const' /'constexpr'添加到兩個尺寸應該可以解決您的問題。 – Jarod42

回答

4

與單個初始化器基於堆棧的數組是零填充,直到他們結束,但你需要做等於是const數組邊界。

#include <iostream> 

int main() 
{  
    const int nSteps = 10; 
    const int nReal = 1; 
    const int N = nSteps * nReal; 
    double H[N] = { 0.0 }; 
    for (int i = 0; i < N; ++i) 
     std::cout << H[i]; 
} 

Live Example

對於動態分配數組,你最好使用std::vector,這也並不需要編譯時已知界

#include <iostream> 
#include <vector> 

int main() 
{ 
    int nSteps = 10; 
    int nReal = 1; 
    int N = nSteps * nReal; 
    std::vector<double> H(N); 
    for (int i = 0; i < N; ++i) 
     std::cout << H[i]; 
} 

Live Example

或者(但不推薦),可以manually allocate零填充陣列狀

double* H = new double[nSteps*nReal](); // without the() there is no zero-initialization 
+0

感謝使用矢量庫幫助我與兩個issus,非常有助於我的編程! – jarhead

+0

請注意,您不需要使用enum pre-C++ 11。你可以使用'const'。 (因爲我不認爲VS2010有'constexpr','const'可能是他會用的) –

+0

@ BenjaminLindley謝謝,更新。我很習慣現在使用'constexpr',我沒有意識到這一點。只對非類型的模板參數,你不能總是使用'const'變量(取決於連接等),並且可能需要'constexpr'。 – TemplateRex

2

如果你知道長度事先你可以做

#define nSteps 10000 
#define nReal 10 

然後

double H[nSteps*nReal] = {0}; 

或者,您也可以將const關鍵字添加到yo而不是使用define s。

+1

比MACRO更適合使用'constexpr'。 – Jarod42