многомерные очень большие массивы с ++ - PullRequest
0 голосов
/ 28 ноября 2018

Я написал код для многомерных очень больших массивов.Он компилируется, но когда я его выполняю, он дает мне ошибку сегментации.Мой код:

int NT = 35; int NX = 25; int NY = 25; int NZ = 25;
double dx = 0.5; double dy = 0.5; double dz = 0.5; double dt = 0.1;
double PosT[NT];
double PosX[NX];
double PosY[NY];
double PosZ[NZ];
for (int i = 0; i < NT; i++)
    PosT[i] = i * dt + dt;
for (int i = 0; i < NX; i++)
    PosX[i] = dx * i;
for (int i = 0; i < NY; i++)
    PosY[i] = dy * i;
for (int i = 0; i < NZ; i++)
    PosZ[i] = dz * i;
double* b_x = (double*)malloc(NX*NY*NZ * sizeof(double));
double* b_y = (double*)malloc(NX*NY*NZ * sizeof(double));
if (b_x == NULL || b_y == NULL) {
    cout << "Malloc space error!" << endl;
    return 0;
}
for (int ix = 0; ix < NX; ix++) {
    for (int iy = 0; iy < NY; iy++) {
        for (int iz = 0; iz < NZ; iz++) {
            int position = ix * NY*NZ + iy * NZ + iz;
            b_x[position] = 0.;
            b_y[position] = 0.;
        }
    }
}

Мой код работает до сих пор, но когда я использую следующий очень большой 2d массив по malloc, я получаю ошибку.Далее следует следующий код:

double** B=(double**)malloc(NX*NY*NZ*LT*sizeof(double*));
if (B == NULL) {
    cout << "Malloc space error!" << endl;
    return 0;
}
cout << "following not works" << endl;
for (int ix = 0; ix < NX; ix++) {
    for (int iy = 0; iy < NY; iy++) {
        for (int iz = 0; iz < NZ; iz++) {
            int position = ix * NY*NZ + iy * NZ + iz;
            for (int it = 0; it < NT; it++) {
                B[position][it] = 0.;
                cout << B[position][it] << endl;
            }
        }
    }
}

Я пробовал malloc, но он не работал.Любые решения или предложения.Каковы альтернативные способы использования очень больших таких массивов?потому что я получаю ошибку сегментации ядра сбрасывает ошибку.

1 Ответ

0 голосов
/ 28 ноября 2018

Я не решаюсь ответить на этот вопрос, но следующее выглядит неправильно: double** B=(double**)malloc(NX*NY*NZ*LT*sizeof(double*)); и должно быть: double** B=malloc(NX*NY*NZ*NT*sizeof(double));

Похоже, вы выделили только половину того, что вам нужно.

...