Se il programma si presenta così ...
int main(int, char **) {
double x[5000][500],y[5000][500],z[5000][500];
// ...
return 0;
}
... poi si traboccano lo stack. Il modo più veloce per risolvere questo problema è aggiungere la parola statica.
int main(int, char **) {
static double x[5000][500],y[5000][500],z[5000][500];
// ...
return 0;
}
Il secondo modo più veloce per risolvere questo problema è quello di spostare la dichiarazione dalla funzione:
double x[5000][500],y[5000][500],z[5000][500];
int main(int, char **) {
// ...
return 0;
}
Il terzo modo più veloce per risolvere questo problema è quello di allocare la memoria sul mucchio:
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;
}
Il quarto modo più veloce consiste nell'assegnarli all'heap utilizzando std :: vector.Sono presenti meno righe nel tuo file ma più righe nell'unità di compilazione e devi pensare a un nome significativo per i tipi di vettore derivati o inserirli in uno spazio dei nomi anonimo in modo che non inquinino lo spazio dei nomi globale:
#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;
}
il modo quinto più veloce è ripartirli sul mucchio, ma utilizzare modelli così le dimensioni non sono così remote dagli oggetti:
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;
}
il modo più performante è allocare le matrici bidimensionali come uno -array dimensionali e quindi utilizzare l'aritmetica dell'indice.
Tutto ciò presuppone che si abbia un motivo, buono o scarso, per voler creare il proprio meccanismo di array multidimensionale. Se non avete ragione, e si aspettano di utilizzare nuovamente gli array multidimensionali, considerare vivamente di installare una libreria:
Si dichiara y due volte. Penso che tu voglia x, ye z. –
Domanda StackOverflow classica. :-) – CDR
Per inciso, è un po 'inquietante che consideriamo doppio x [5] [5], ecc. Corretto ma doppio x [5000] [500] sospetto. Era il limite? In un certo senso, una risposta valida sarebbe "non ti preoccupare, il tuo codice è perfettamente corretto secondo lo standard C++". –