Si el programa se ve así ...
int main(int, char **) {
double x[5000][500],y[5000][500],z[5000][500];
// ...
return 0;
}
... entonces se desbordan la pila. La forma más rápida de arreglar esto es agregar la palabra estática.
int main(int, char **) {
static double x[5000][500],y[5000][500],z[5000][500];
// ...
return 0;
}
La segunda forma más rápida de solucionar este problema es mover la declaración de la función:
double x[5000][500],y[5000][500],z[5000][500];
int main(int, char **) {
// ...
return 0;
}
La tercera forma más rápida de solucionar este problema es asignar la memoria en el montón:
int main(int, char **) {
double **x = new double*[5000];
double **y = new double*[5000];
double **z = new double*[5000];
for (size_t i = 0; i < 5000; i++) {
x[i] = new double[500];
y[i] = new double[500];
z[i] = new double[500];
}
// ...
for (size_t i = 5000; i > 0;) {
delete[] z[--i];
delete[] y[i];
delete[] x[i];
}
delete[] z;
delete[] y;
delete[] x;
return 0;
}
La cuarta forma más rápida es asignarlos en el montón usando std :: vector.Hay menos líneas en su archivo pero más líneas en la unidad de compilación, y debe pensar en un nombre significativo para sus tipos de vectores derivados o incluirlos en un espacio de nombres anónimo para que no contaminen el espacio de nombres global:
#include <vector>
using std::vector
namespace {
struct Y : public vector<double> { Y() : vector<double>(500) {} };
struct XY : public vector<Y> { XY() : vector<Y>(5000) {} } ;
}
int main(int, char **) {
XY x, y, z;
// ...
return 0;
}
la forma quinto mejor es asignar ellas en el montón, pero el uso de las plantillas por lo que las dimensiones no son tan alejado de los objetos:
include <vector>
using namespace std;
namespace {
template <size_t N>
struct Y : public vector<double> { Y() : vector<double>(N) {} };
template <size_t N1, size_t N2>
struct XY : public vector< Y<N2> > { XY() : vector< Y<N2> > (N1) {} } ;
}
int main(int, char **) {
XY<5000,500> x, y, z;
XY<500,50> mini_x, mini_y, mini_z;
// ...
return 0;
}
la forma mas potente es la asignación de las matrices bidimensionales como uno matrices tridimensionales, y luego usar aritmética de índice.
Todo lo anterior supone que tiene alguna razón, una buena o una mala, para querer crear su propio mecanismo de matriz multidimensional. Si no tiene la razón, y espera utilizar matrices multidimensionales de nuevo, considerar seriamente la posibilidad de instalar una biblioteca:
Lo declararás dos veces. Creo que quieres x, y y z. –
Pregunta clásica de StackOverflow. :-) – CDR
Por un lado, es un poco molesto que consideremos el doble x [5] [5], etc. correcto pero el doble x [5000] [500] sospechoso. ¿Era el límite? En cierto sentido, una respuesta válida sería "no se preocupe, su código es perfectamente correcto según el estándar de C++". –