0
這是我的程序的簡化版本,我的程序旨在從高度圖創建隨機地形。這是我如何創建高度圖。模糊圖像矩陣時出現分割錯誤。 [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;
}
結果應該是一個矩陣,其值趨向於全球平均值。
然而,我得到的結果是一個矩陣,通常都是零。
代碼應該聲明兩個網格,而不是使用對malloc()和free()的調用。建議:'grid_t originalGrid [height] [width] = {0};'和'grid_t blurGrid [height] [width] = {0};' – user3629249
'blur_grid()'函數使用'radius'中所有位置的完整值它應該使用周圍值的一些百分比,其中百分比越遠離目標位置越遠。建議使用目標的25%,所有8個位置中的5%位於一個位置,距所有16個位置中的2.5%位於2個位置。 – user3629249