分段故障

时间:2012-04-25 10:46:47

标签: c segmentation-fault netbeans-7

我正在尝试使用C ++中的顺序编程清楚地获得mandelbrot图像,但我在运行时遇到了分段错误。我不知道seg。错误,但我的程序完美编译,没有错误。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int file_write(unsigned int width, unsigned int height)
{
    unsigned int **color = NULL;
    FILE *fractal = fopen("mandelbrot_imageSequential.ppm","w+");
    if(fractal != NULL)
    {
        fprintf(fractal,"P6\n");
        fprintf(fractal,"# %s\n", "Mandelbrot_imageSequential.ppm");
        fprintf(fractal,"%d %d\n", height, width);
        fprintf(fractal,"40\n");
        int x = 0, y = 0;
        unsigned int R = 0, G = 0, B = 0;
        for(x = 0; x < width; ++x)
        {
            for(y = 0; y < height; ++y)
            {
                R = (color[y][x]*10);
                G = 255-((color[y][x]*10));
                B = ((color[y][x]*10)-150);
                if(R == 10)
                    R = 11;
                if(G == 10)
                    G = 11;
                if(B == 10)
                    B = 11;
                putc(R, fractal);
                putc(G, fractal);
                putc(B, fractal);
            }
        }
        fclose(fractal);
    }
    return 0;
}
int method(int x, int y, int height, int width, double min_re, double max_re, double min_im, double max_im, int max_iterations)
{
    double threshold = 4;
    double x_factor = (max_re-min_re)/(width-1);
    double y_factor = (max_im-min_im)/(height-1);
    double c_im = max_im - y*y_factor;
    double c_re = min_re + x*x_factor;
    double Z_re = c_re, Z_im = c_im;
    unsigned int col = 0;
    for(unsigned n = 0; n < max_iterations; ++n)
    {
        double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
        if(Z_re2 + Z_im2 > threshold)
        {
            col = n;
            break;
        }
        Z_im = 2 * Z_re * Z_im + c_im;
        Z_re = Z_re2 - Z_im2 + c_re;
    }
    return col;
}
int main(int argc, char *argv[])
{
    unsigned int width;
    unsigned int height;
    unsigned int max_iterations;
    unsigned int **color = NULL;
    int x,y;
    double threshold;
    double min_re;
    double max_re;
    double min_im;
    double max_im;
    unsigned int NUM_OF_THREADS;
    if(argc != 10)
    {
        printf("There is an error in the input given.\n");
        return 0;
    }
    else
    {
        height = atoi(argv[1]);
        width = atoi(argv[2]);
        max_iterations = atoi(argv[3]);
        min_re = atof(argv[4]);
        max_re = atof(argv[5]);
        min_im = atof(argv[6]);
        max_im = atof(argv[7]);
        threshold = atoi(argv[8]);
        NUM_OF_THREADS = atoi(argv[9]);
    }
    color = (unsigned int**)malloc(height*sizeof(unsigned int*));
    printf("height = %d\twidth = %d\tmaximum_iterations = %d\tminimum_x-value = %.2f\tmaximum_x-value = %.2f\tminimum_y-value = %.2f\tmaximum_y-value = %.2f\tthreshold_value = %.2f\tno. of threads = %d\t\n",height,width,max_iterations,min_re,max_re,min_im,max_im,threshold,NUM_OF_THREADS);
    for(x = 0; x < height; x++)
    {
        color[x] = (unsigned int*)malloc(width*sizeof(unsigned int));
    }
    time_t ts,te;
    time(&ts);
    method(x,y,height,width,min_re,max_re,min_im,max_im,max_iterations);
    time(&te);
    double diff = difftime(te,ts);
    file_write(width, height);
    printf("Total Time elapsed: %f\n",diff);
    return 0;
}

如何纠正此分段错误?

3 个答案:

答案 0 :(得分:2)

file_write函数中至少存在一个问题。

  1. unsigned int **color = NULL;
  2. R = (color[y][x]*10);
  3. 我认为颜色应该是输入参数。

答案 1 :(得分:1)

如果您使用的是Linux计算机,请执行以下操作:

$ulimit -c unlimited

然后运行代码。注意核心。生成[pid]文件。像下面一样启动gdb

$gdb ./your_app core.[pid]

它将带您发生segfault的声明。在gdb提示符下发出“backtrace”命令以查看调用层次结构。

请记住使用“-g”标志进行编译以获得更详细的gdb输出。

答案 2 :(得分:0)

您的代码存在两个主要问题:

  1. 您为color数组分配内存,但在color内使用不同的 file_write(),其初始化为NULL

    您需要将第一个color作为参数传递给file_write()

    int main(...)
    {
        ...
        file_write(color, width, height);
        printf("Total Time elapsed: %f\n",diff);
        return 0;
    }
    

    并将另一个color声明为file_write()的参数:

    int file_write(unsigned int **color, unsigned int width, unsigned int height)
    {
        /* unsigned int **color = NULL; // Removed */
       ...
    
  2. 您只需拨打method()一次,而不是将任何内容存储到color。你需要循环调用它。类似于:

    /* Untested */
    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            color[y][x] = method(x,y,height,width,min_re,max_re,min_im,max_im,max_iterations);
        }
    }
    
  3. 然后,当然,您应该检查malloc()fopen()fprintf()fclose(),...的返回值,并检查输入变量是否有合理的价值观等等。

    我还注意到您将widthheight以不同的顺序传递给file_write()method()。为了避免将来出现问题,我会将method()函数更改为method(x, y, width, height),以便水平和垂直参数以相同的顺序传递。