Если ваша программа выглядит следующим образом ...
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;
}
самый производительный способ выделить двумерные массивы в качестве одного -мерные массивы, а затем использовать индексную арифметику.
Все вышеизложенное предполагает, что у вас есть причина, хорошая или плохая, для того, чтобы создать собственный механизм многомерных массивов. Если у вас нет никаких оснований, и предполагается использовать многомерные массивы снова, сильно рассмотреть вопрос об установке библиотеки:
Вы объявляете y дважды. Я думаю, вам нужны x, y и z. –
Классический вопрос о StackOverflow. :-) – CDR
Как в сторону, это немного беспокоит, что мы рассматриваем double x [5] [5] и т. Д. Правильно, но double x [5000] [500] подозрительно. Был ли предел? В некотором смысле, действительный ответ будет «не волнуйтесь, ваш код совершенно корректен в соответствии со стандартом C++». –