Получение ошибки сегментации на суммирующей линии, не уверен, в чем проблема - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь создать двумерное гауссовское ядро. Строка с надписью

sum += kernel[x+2][y+2]

выдает ошибку сегментации в соответствии с GDB. Это мой первый выход на C ++, поэтому я могу представить, что есть несколько вещей, которые я могу сделать «лучше».

Предполагается, что функция main () просто печатает содержимое ядра, чтобы я мог проверить правильность его вывода.

#include <cmath>
#include <iomanip> 
#include <iostream>

using namespace std;    

void CreateKernel(double sigma, int k_size)
{

    double kernel[k_size][k_size];
    double pre_const; 
    double r;
    double sum = 0.0; //for normalizing 
    pre_const = 1 / (2 * M_PI * sigma * sigma);
    for (int x = -2; x <= k_size; x++) 
    {
        for(int y = -2; y <= k_size; y++) 
        {
            r = ((x * x) + (y * y)) / (2 * sigma * sigma);
            kernel[x+2][y+2] = (pre_const * exp(r));  
            sum += kernel[x+2][y+2];   
        }
    }
    for (int i = 0; i < k_size; ++i)
    {
        for (int j = 0; j < k_size; ++j)
        {
            kernel[i][j] /= sum; //normalize
        }
    }

}

int main() 

{   

    double sigma = 3.0;
    int k_size = 5;
    double kernel[k_size][k_size];


    CreateKernel(sigma, k_size); 


    for (int i = 0; i < 5; ++i) { 
        for (int j = 0; j < 5; ++j) 
            cout << kernel[i][j] << "\t"; 
            cout << endl; 
    } 
} 

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Если честно, я понятия не имею, что такое ядро ​​Гаусса.

Но ваша проблема в том, что вы обращаетесь к матрице ядра вне диапазона:

kernel[x+2][y+2] = ...

Это назначение только допустимо, если x+2 < k_size (так как вы объявили, что ваша матрица ядра имеет размер k_size), но для l oop позволяет x и y перерасти в k_size.

Минимальный пример, который будет генерировать такой же вид ошибки сегментации будет следующим:

int vector[3];
vec[0] = 42; // -> Accessing first element
vec[1] = 42; // -> Accessing second element
vec[2] = 42; // -> Accessing third element
vec[3] = 42; // -> Segmentation fault since the vector only has 3 elements.
0 голосов
/ 15 января 2020

Вы пытаетесь читать / записывать память вне массива (k_size + 2).

...