模糊图像矩阵时出现分割错误。 [C]

这是我的程序的简化版本,我的程序旨在从高度图创建随机地形。这是我如何创建高度图。模糊图像矩阵时出现分割错误。 [C]

我已经通过gdb运行它,但是当我通过gdb运行它时,它从来没有seg故障。当我正常运行它但它segfaults。我不知道为什么,不应该这样工作。有没有一种工具可以用来可视化我的程序的内存使用情况?

我想模糊有权访问像素值的矩阵。矩阵逐列索引。

#include <stdio.h> 

#include <stdlib.h>

#include <limits.h>

#include <time.h>

#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))

#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))

typedef struct {

int width;

int height;

double ** mat;

} grid_t;

static double r2()

{

return (double)rand()/(double)RAND_MAX ;

}

grid_t * create_grid(int width, int height) {

grid_t * grid = malloc(sizeof(grid));

grid->width = width;

grid->height = height;

grid->mat = malloc(height*sizeof(double *));

int i = 0;

for(; i < height; i++){

grid->mat[i] = malloc(width*sizeof(double));

}

return grid;

}

grid_t * clone_grid(grid_t * grid) {

grid_t * clone = create_grid(grid->width, grid->height);

int i = 0;

for(; i < clone->height; i++){

int j = 0;

for(; j < clone->width; j++){

clone->mat[i][j] = grid->mat[i][j];

}

}

return clone;

}

void init_rand(grid_t * grid) {

int i = 0;

for(; i < grid->height; i++) {

int j = 0;

for(; j < grid->width; j++) {

//srand(time(NULL) + rand()%time(NULL)); uncomment this for the weird effect.

grid->mat[i][j] = r2();

}

}

}

void free_grid(grid_t * grid) {

int i = 0;

for(; i < grid->height; i++) {

free(grid->mat[i]);

}

free(grid->mat);

}

void blur_grid(grid_t * grid, int radius) {

printf("blurring...");

grid_t * clone = clone_grid(grid);

int i, j, x, y;

for(i = 0; i < grid->height; i++) {

int x_min = MAX(0, i-radius), x_max = MIN(clone->height, i+radius);

for(j = 0; j < grid->width; j++) {

int y_min = MAX(0, j-radius), y_max = MIN(clone->width, j+radius);

unsigned int sum = 0;

int count = 0;

for(x = x_min; x < x_max; x++){

for(y = y_min; y < y_max; y++){

sum += clone->mat[x][y];

count++;

}

}

grid->mat[i][j] = sum/count;

}

}

printf("blurred\n");

free_grid(clone);

}

int main() {

int width = 512;

int height = 1024;

int blur_iter = 1;

int blur_radius = 2;

grid_t * grid = create_grid(width, height);

init_rand(grid);

int i = 0;

for(; i < blur_iter; i++) {

blur_grid(grid, blur_radius);

}

free_grid(grid);

return 0;

}

结果应该是一个矩阵,其值趋向于全球平均值。

然而,我得到的结果是一个矩阵,通常都是零。

回答:

你模糊的问题是你的sum变量的类型是unsigned int,但应该是double。 此外您正在进行整数除法。

unsigned int sum = 0; 

应该

double sum = 0; 

接下来的问题是这一行:

grid_t * grid = malloc(sizeof(grid)); 

你分配grid_t *的大小,但应分配grid_t的大小。
该线路应该是

grid_t * grid = malloc(sizeof(grid_t)); 


只是为了completness你还需要将指针释放到电网本身:

free_grid(grid); 

free(grid);

也是一样的模糊的克隆。

以上是 模糊图像矩阵时出现分割错误。 [C] 的全部内容, 来源链接: utcz.com/qa/258762.html

回到顶部