что вызывает необработанное исключение в памяти: переполнение стека - PullRequest
0 голосов
/ 17 октября 2019

Я новичок в C ++ и самостоятельно реализую алгоритм детектора ребер Canny. для этого я объявил несколько 2D-массивов. выдает ошибку «Необработанное исключение в 0x000A1809 в ConsoleApplication3.exe: 0xC00000FD: переполнение стека (параметры: 0x00000000, 0x00E92000)» *

Я минимизировал количество элементов в моих массивах, и это сработало. но когда мне нужны массивы с большим количеством элементов

//2.Gradian Calculation: a.Calculating Gx and Gy   b.Calculation sqrt(Gx^2 + Gy^2)   c.Calculating the gradiant orientation
int Fx[3][3] = { {-1,0,1},{-2,0,2},{-1,0,1} };
int Fy[3][3] = { {1,2,1},{0,0,0},{-1,-2,-1} };
int image[100][100] = { 50 };
int gradian_x[100][100] = { 0 };
int gradian_y[100][100] = { 0 };
double edgeStrength[100][100] = { 0 };

//Calculating Gx
for (int i = 1; i < 99; i++)
{
    for (int j = 1; j < 99; j++)
    {
        gradian_x[j][i] = image[j - 1][i - 1] * Fx[0][0] + image[j][i - 1] * Fx[1][0] + image[j + 1][i - 1] * Fx[2][0] + image[j + 1][i + 1] * Fx[2][2] + image[j][i + 1] * Fx[1][2] + image[j - 1][i + 1] * Fx[0][2];

    }
}

1 Ответ

0 голосов
/ 17 октября 2019

Пространство стека ограничено. При условии, что int составляет 4 байта на вашей платформе и double равно 8 байтов, вы запрашиваете 195 КБ памяти, которая может быть или не быть доступной в стеке (это игнорирует любые другие необходимые вещи из стека, такие как вызовы функций и т. Д.).

Для хранения больших наборов данных следует использовать динамическое выделение памяти с std::vector (вместо памяти стека используется куча памяти, которая намного больше стека):

const int initialValue = 50;
std::vector<std::vector<int>> image (100, std::vector<int>(100, initial_value);

Обратите внимание, что int image[100][100] = { 50 }; будет инициализировать только image[0][0] до 50, а остальные элементы равны 0. Это исправлено в примере выше (все элементы инициализируются с 50 там), но если вы хотитечтобы сохранить это поведение, вы должны сделать initial_value равным 0 и изменить image[0][0] напрямую.


Для повышения производительности предпочтительнее использовать специализированную библиотеку, например Eigen. Если вам не нужны внешние ресурсы, вы можете вместо этого использовать std::vector<std::array<int, 100>>, который будет выделять память в одном блоке (лучше для кэша процессора):

std::array<int, 100> initialArray;
std::fill(initialArray.begin(), initialArray.end(), 50);
std::vector<std::array<int, 100>> image (100, initialArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...