Ответ 1
Если ваша программа выглядит так...
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;
}
Самый эффективный способ - выделить двумерные массивы в виде одномерных массивов, а затем использовать индексную арифметику.
Все вышеизложенное предполагает, что у вас есть причина, хорошая или бедная, за то, что вы хотите создать свой собственный многомерный механизм массива. Если у вас нет причин и ожидайте снова использовать многомерные массивы, настоятельно рекомендуем установить библиотеку:
-
Способы воспроизведения - красиво-с-STL - это используйте Boost Multimimensional Массив.
-
Скоростным способом является использование Blitz ++.