Если ваша программа выглядит так ...
int main(int, char **) {
double x[5000][500],y[5000][500],z[5000][500];
// ...
return 0;
}
... тогда вы переполняете стек. Самый быстрый способ исправить это - добавить слово static .
.
int main(int, char **) {
static double x[5000][500],y[5000][500],z[5000][500];
// ...
return 0;
}
Второй самый быстрый способ исправить это - убрать объявление из функции:
double x[5000][500],y[5000][500],z[5000][500];
int main(int, char **) {
// ...
return 0;
}
Третий самый быстрый способ исправить это - выделить память в куче:
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;
}
Четвертый самый быстрый способ - разместить их в куче, используя std :: vector. В вашем файле меньше строк, но больше строк в модуле компиляции, и вы должны либо придумать осмысленное имя для ваших производных векторных типов, либо поместить их в анонимное пространство имен, чтобы они не загрязняли глобальное пространство имен:
#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;
}
Пятый самый быстрый способ - это разместить их в куче, но использовать шаблоны, чтобы измерения не были так удалены от объектов:
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;
}
Наиболее эффективный способ - выделить двумерные массивы как одномерные массивы, а затем использовать индексную арифметику.
Все вышеперечисленное предполагает, что у вас есть какая-то причина, хорошая или плохая, для создания собственного механизма многомерных массивов. Если у вас нет причин и вы планируете снова использовать многомерные массивы, настоятельно рекомендуем установить библиотеку: