En c++ las formaciones en espacio de memoria automático requieren que el tamaño sea una constante (un valor conocido en tiempo de compilación) no una variable:
int cafi,caco,vael; // cafi y caco son variables.
cout<<"Cantidad de filas que desea"<<endl;
cin>>cafi;
cout<<"Cantidad de columnas que desea"<<endl;
cin>>caco;
for(int i=0; i < cafi; i++){
int array[cafi][caco]; // Incorrecto, cafi y caco no son valores constantes.
Si lo que necesitas es que los valores sean definidos por el usuario, entonces tu formación debe ir en espacio de memoria dinámico, es decir: debes usar el operador new
para crear memoria dinámica:
int cafi,caco,vael;
cout<<"Cantidad de filas que desea"<<endl;
cin>>cafi;
cout<<"Cantidad de columnas que desea"<<endl;
cin>>caco;
// Pedimos memoria para las filas.
int **array = new int*[cafi];
// Pedimos memoria para las columnas.
for (int i = 0; i != cafi; ++i)
array[i] = new int[caco];
for (int i = 0; i != cafi; ++i) {
// ...
No olvides que cuando ya no uses esa memoria, deberás liberarla en sentido inverso a como la pediste:
// Liberamos las columnas
for (int i = 0; i != cafi; ++i)
delete[] array[i];
// Liberamos las filas.
delete[] array;
Propuesta.
Deja de usar formaciones, usa std::vector
:
unsigned long cafi, caco;
cout << "Cantidad de filas que desea"<<endl;
cin >> cafi;
cout << "Cantidad de columnas que desea"<<endl;
cin >> caco;
auto array = std::vector<std::vector<int>>(cafi, std::vector<int>(caco));
// Leer datos.
int f{};
for (auto &fila : array)
{
int c{};
for (auto &valor : fila)
{
cout << "Valor del elemento situado en la fila " << f << " columna " << c << '\n';
cin >> valor;
++c;
}
++f;
}
Puedes ver el código funcionando en Try it online!.
Otras cosas a tener en cuenta.
- Evita incluir cabeceras que no usas: no estás usando nada de las cabecera
<locale.h>
ni <Windows.h>
.
- Usa las cabeceras adecuadas: la cabecera
<locale.h>
pertenece al lenguaje c, si la necesitas en un programa C++ deberías usar su versión adaptada a dicho lenguaje <clocale>
, lee este hilo para saber más del tema.
- Procura no abusar de la cláusula
using namespace
, si realmente necesitas usarla hazlo en el ámbito lo más pequeño posible (por ejemplo: en el cuerpo de la función), lee este hilo para saber más del tema.
- Procura no abusar de
std::endl
, esa orden es necesaria en contadas ocasiones y no debería usarse indiscriminadamente, lee este hilo para saber más del tema.
- Favorece el pre-incremento frente al post-incremento, lee este artículo para saber más del tema.
- Deja a tu código respirar: No hay necesidad de apretujar todas las líneas y todos los operadores.