Array [n] vs Array [10] - Inicializando array com variável vs número real


91

Estou tendo o seguinte problema com meu código:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Retorna o seguinte erro:

error: variable-sized object 'tenorData' may not be initialized

Considerando que usando double tenorData[10]obras.

Alguém sabe por quê?


4
Ajudaria dar uma linguagem. Em C ++, seus arrays dessa forma precisam ter um tamanho constante de tempo de compilação.
OrangeAlmondSoap

C ++, usando Codeblocks com o compilador mingw32-g ++!
msmf14

Obrigado, Justin e @AndrewVarnerin, isso resolveu! adicionado const antes do int: const int n = 10; Resolvido!
msmf14

Respostas:


196

Em C ++, arrays de comprimento variável não são permitidos. G ++ permite isso como uma "extensão" (porque C permite), portanto, em G ++ (sem -pedanticseguir o padrão C ++), você pode fazer:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

Se você quiser uma "matriz de comprimento variável" (melhor chamada de "matriz de tamanho dinâmico" em C ++, uma vez que matrizes de comprimento variável adequadas não são permitidas), você também precisa alocar memória dinamicamente:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

Ou, melhor ainda, use um contêiner padrão:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

Se você ainda deseja uma matriz adequada, pode usar uma constante , não uma variável , ao criá-la:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

Da mesma forma, se quiser obter o tamanho de uma função em C ++ 11, você pode usar constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
Obrigado, esta é outra boa solução. O que eu realmente preciso no final é um vetor em vez de um array!
msmf14 de

1
@ msmf14: Sim, contêineres padrão, como vector, são incrivelmente úteis.
Cornstalks de

A solução vetorial inicializa cada elemento quando você chama "std :: vector <[alguma classe]> a (n);"?
Justin

3
Se você não estiver alocando muito (se for pequeno em comparação com o tamanho da pilha), prefiro usar a memória da pilha com alloca (3) e posicionamento novo. Dessa forma, você não precisa se preocupar em liberar a memória, e a alocação de memória é muito mais rápida.
holgac

2
+1 por mencionar que o g ++ permite isso. Porque não observei esse erro e isso explica a diferença.
gebbissimo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.