Есть ли обходной путь для ограничения размера глобальной переменной в Visual C? - PullRequest
2 голосов
/ 10 февраля 2012

Как обойти ошибку Visual Studio Visual C # C2148?Вот код, который выдает ошибку:

#define ACOUNT 2000
#define BCOUNT 9000
#define CCOUNT 195

struct s_ptx {

      int pvCount[ACOUNT][BCOUNT][CCOUNT];
} ;

Это выдает VStudio 2010 Visual C (компиляция под 64-битную версию), ошибка # C2148: ошибка C2148: общий размер массива не должен превышать 0x7fffffff bytes

Я знаю, что мог бы динамически выделить 3d-массив pvCount, но тогда мне пришлось бы делать миллионы выделений и свободных.У меня 192 гигабайта памяти, поэтому я пытаюсь найти переключатель или опцию компилятора, которая позволяет что-то такого размера.

Редактировать: сложная проблема, которую я упустил, пытаясь упростить вещи, заключается в том, что ptx - это указатель, который во время выполнения используется как массив структур:

ptx *Ptx        =  (ptx *)   calloc(10,  sizeof(ptx));
for (int i = 0; i < 10; ++i)
    {
     Ptx->pv = (int (*)[BCOUNT][CCOUNT] )  malloc( (unsigned long) ACOUNT * BCOUNT *CCOUNT * sizeof(int));

}


 for (int jav = 0; jav < 10; ++jav)
        for (int j = 0; j < ACOUNT; ++j)
            for (int k = 0; k < BCOUNT; ++k)
                for (int m = 0; m < CCOUNT; ++m)
                    Ptx[jav].pv[j][k][m] = j + k + m;

Поэтому, когда я запускаю кодЯ получаю ошибку нарушения доступа, возможно потому, что при динамическом размещении я больше не могу использовать: Ptx [jav] .pv [j] [k] [m]

1 Ответ

5 голосов
/ 10 февраля 2012

Вам не нужны миллионы malloc. просто:

int (*arr)[BCOUNT][CCOUNT]=malloc((size_t)ACOUNT*BCOUNT*CCOUNT*sizeof int);

Редактировать: приведение к size_t необходимо, чтобы не переполнять int.

...