Необработанное исключение Переполнение стека в консольном приложении win32

Я написал код симуляции как консольное приложение win32 с использованием Microsoft Visual C ++ 2010 Express. Код работает нормально, пока три мои переменные имеют определенную длину. Они выглядят так в начале моего main.cpp и нужны только в этом файле main.cpp.

 #define Nx 19
#define Ny 19
#define Nz 19

Я использую эти переменные для создания нескольких трехмерных матриц в основной программе

double a[Nx][Ny][Nz];

double b[Nx][Ny][Nz];

Код работает нормально, пока Nx, Ny, а также Nz 18 или меньше, но когда я пытаюсь использовать большее число, я получаю сообщение об ошибке, которое выглядит следующим образом:
Unhandled exception at 0x012dd4d7 in main.exe: 0xC00000FD: Stack overflow. Затем код останавливается в chkstlk.asm, Я ни в коем случае не эксперт и даже не очень опытный, но если бы кто-то мог объяснить, как обойти эту проблему, достаточно простыми терминами, я был бы очень признателен.

1

Решение

У вас есть 2 массива каждый (при условии, что двойной размер 2 байта) равен 19 кубам, умноженным на 8 байтов. Для обоих это превышает 100 килобайт. Я не уверен, как (или если) вы делаете в Windows это, но вы могли бы соответственно увеличить свою память стека. В качестве альтернативы используйте динамическое распределение для ваших массивов. Мы можем только представить, что еще у вас есть в стеке, но если он переполнен, вам нужно увеличить размер памяти стека или выделить память в куче.

Обратите внимание, что разница в размере памяти для массива 18x18x18 и массива 19x19x19 составляет (53872 — 11664) = 42208 байт для КАЖДОГО из этих массивов, поэтому разница от изменения 19 до 18 не так незначительна, как вы думаете

0

Другие решения

Выделите массив в куче:

typedef int tdarray[Nx][Ny];

tdarray * a = new tdarray[Nz];

delete [] a;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector