2015-09-24 38 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