Array [n] vs Array [10]: inicialización de la matriz con variable vs número real

91

Tengo el siguiente problema con mi código:

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

Devuelve el siguiente error:

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

Mientras que el uso double tenorData[10]funciona.

¿Alguien sabe por qué?

msmf14
fuente
4
Ayudaría a dar un idioma. En C ++, las matrices de esa forma deben tener un tamaño constante en tiempo de compilación.
OrangeAlmondSoap
¡C ++, usando Codeblocks con el compilador mingw32-g ++!
msmf14
Gracias, Justin y @AndrewVarnerin, ¡eso lo resolvió! agregado const antes del int: const int n = 10; ¡Resuelto!
msmf14

Respuestas:

189

En C ++, las matrices de longitud variable no son legales. G ++ permite esto como una "extensión" (porque C lo permite), por lo que en G ++ (sin tratar -pedanticde seguir el estándar C ++), puede hacer:

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

Si desea una "matriz de longitud variable" (mejor denominada "matriz de tamaño dinámico" en C ++, ya que no se permiten las matrices de longitud variable adecuadas), debe asignar memoria de forma dinámica usted mismo:

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

O, mejor aún, use un contenedor estándar:

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

Si aún desea una matriz adecuada, puede usar una constante , no una variable , al crearla:

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

De manera similar, si desea obtener el tamaño de una función en C ++ 11, puede usar un constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression
Tallos de maiz
fuente
1
Gracias, esta es otra buena solución. ¡Lo que realmente necesito al final es un vector en lugar de una matriz!
msmf14
1
@ msmf14: Sí, los contenedores estándar, como vector, son increíblemente útiles.
Cornstalks
¿La solución vectorial inicializa cada elemento cuando llama a "std :: vector <[alguna clase]> a (n);"?
Justin
3
Si no está asignando mucho (si es pequeño en comparación con el tamaño de la pila), preferiría usar la memoria de pila con alloca (3) y la ubicación nueva. De esta forma, no necesita preocuparse por liberar memoria y la asignación de memoria es mucho más rápida.
holgac
2
+1 por mencionar que g ++ lo permite. Porque no observé este error y esto explica la diferencia.
gebbissimo