2017-12-02 216 views
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; 
} 

結果應該是一個矩陣,其值趨向於全球平均值。

然而,我得到的結果是一個矩陣,通常都是零。

+0

代碼應該聲明兩個網格,而不是使用對malloc()和free()的調用。建議:'grid_t originalGrid [height] [width] = {0};'和'grid_t blurGrid [height] [width] = {0};' – user3629249

+0

'blur_grid()'函數使用'radius'中所有位置的完整值它應該使用周圍值的一些百分比,其中百分比越遠離目標位置越遠。建議使用目標的25%,所有8個位置中的5%位於一個位置,距所有16個位置中的2.5%位於2個位置。 – user3629249

回答

1

你模糊的問題是你的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); 

也是一樣的模糊的克隆。