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

Стек на основе массивов с одним intializer нулями не заполнены до их завершения, но вы должны сделать границы массива, равные быть 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 ur вместо использования define s.

+1

Лучше использовать 'constexpr' над MACRO. – Jarod42

Смежные вопросы