una referencia recibir recibe que por pasar parametro matriz matrices llenar funciones funcion enviar con como arreglos c++ arrays parameters declaration

recibir - pasar matriz por referencia c++



El tamaño de matriz C++ depende del parámetro de función provoca errores de compilación (7)

Estás usando algo que no es un estándar. En realidad es estándar C pero no C ++. ¡Qué peculiar es eso!

Explicando un poco más, las matrices de pila de tamaño de ejecución no son parte de C ++, pero son parte de C99, el último estándar para C. Es por eso que algunos compiladores lo obtendrán, mientras que otros no. Recomiendo abstenerse de usarlo para evitar problemas de compatibilidad con el compilador.

La implementación alternativa de la funcionalidad sería usar new y delete, según lo publicado por strager.

Tengo una función simple en la que una matriz se declara con tamaño según el parámetro que sea int.

void f(int n){ char a[n]; }; int main() { return 0; }

Este fragmento de código compila bien en GNU C ++ , pero no en MSVC 2005.

Obtengo los siguientes errores de compilación:

./main.cpp(4) : error C2057: expected constant expression ./main.cpp(4) : error C2466: cannot allocate an array of constant size 0 ./main.cpp(4) : error C2133: ''a'' : unknown size

¿Qué puedo hacer para corregir esto?

(Estoy interesado en hacer que esto funcione con MSVC, sin usar new / delete)


Por lo general, en C (excepto en los compiladores C99, como han señalado otros) y C ++, si desea asignar memoria a la pila, debe conocerse el tamaño de lo que desea asignar en tiempo de compilación. Las variables locales se asignan en la pila, por lo que una matriz cuya longitud depende de un parámetro de función en tiempo de ejecución viola esta regla. Klein tiene razón al señalar que usar el operador ''nuevo'' es una forma de resolver este problema:

char *a = new char [n];

''a'' sigue siendo una variable local asignada en la pila, pero en lugar de ser la matriz completa (que tiene longitud variable), es solo un puntero a una matriz (que siempre es del mismo tamaño y, por lo tanto, conocida en tiempo de compilación). La matriz se asigna en el montón, que generalmente juega la contraparte de la pila: la pila es para cosas con un tamaño conocido en tiempo de compilación, y el montón es para cosas con un tamaño desconocido en una época de compilación.


Puede usar new / delete para asignar / liberar memoria en el montón. Esto es más lento y posiblemente más propenso a errores que el uso de char [n], pero lamentablemente no forma parte del estándar C ++.

Puede utilizar la clase de matriz con ámbito de boost para un método de excepción segura para usar new []. delete [] se invoca automáticamente cuando sale del alcance.

void f(int n) { boost::scoped_array<char> a(new char[n]); /* Code here. */ }

También puede usar std :: vector y reserve () algunos bytes:

void f(int n) { std::vector<char> a; a.resize(n); /* Code here. */ }

Si desea utilizar char [n], compilar como código C99 en lugar de código C ++.

Si por alguna razón debe asignar datos a la pila, use _alloca o _malloca / _freea, que son extensiones proporcionadas por MSVC libs y demás.


¿Sería razonable usar un vector<> lugar de una matriz? O bien, ya que está reemplazando un char * , std::string ? Esos funcionan bien con el tamaño del tiempo de ejecución, aunque puede haber otras razones para no usarlos.


array de longitud variable fue introducido en C99. Es compatible con gcc pero no con msvc. De acuerdo con una persona en el equipo de MSVC, Microsoft no tiene ningún plan para admitir esta característica en su compilador c / C ++. Sugirió usar std :: vector en esos casos.

Tenga en cuenta que C99 no requiere que la matriz se asigne en la pila. El compilador puede asignarlo en el montón. Sin embargo, gcc asigna la matriz en la pila.


Lo que has encontrado es una de las extensiones del compilador Gnu para el lenguaje C ++. En este caso, Visual C ++ es completamente correcto. Las matrices en C ++ se deben definir con un tamaño que sea una expresión constante en tiempo de compilación.

Hubo una característica agregada a C en la actualización de 1999 a ese lenguaje llamada matrices de longitud variable, donde esto es legal. Si puede encontrar un compilador de C que sea compatible con C99, no es fácil. Pero esta característica no es parte de C ++ estándar, no se agregará en la próxima actualización del estándar de C ++.

Hay dos soluciones en C ++. El primero es usar un std :: vector, el segundo es usar el operador new [] :

char *a = new char [n];

Mientras escribía mi respuesta, otra publicó una sugerencia para usar _alloca. Recomiendo encarecidamente en contra de eso. Simplemente cambiaría un método no estándar y no portátil por otro igual que el compilador específico.


Su método de asignación de la pila es una extensión de g ++. Para hacer el equivalente bajo MSVC, necesita usar _alloca:

char *a = (char *)_alloca(n);