-2

C++ のシーケンシャル プログラミングでマンデルブロ イメージを明確に取得しようとしていますが、実行時にセグメンテーション エラーが発生します。セグについてはわかりません。失敗しましたが、私のプログラムはエラーなしで完全にコンパイルされています。

#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;
}

このセグメンテーション違反を修正するにはどうすればよいですか?

4

3 に答える 3

2

file_write 関数に少なくとも 1 つの問題があります。

  1. unsigned int **color = NULL;
  2. R = (color[y][x]*10);

色は入力パラメータであるべきだと思います。

于 2012-04-25T10:54:49.577 に答える
1

Linux マシンを使用している場合は、次の手順を実行します。

$ulimit -c unlimited

次に、コードを実行します。core.[pid] ファイルが生成されることに注意してください。次のようにgdbを起動します

$gdb ./your_app core.[pid]

segfault が発生したステートメントが表示されます。gdb プロンプトで「backtrace」コマンドを発行して、呼び出し階層を確認します。

より詳細な gdb 出力を取得するには、「-g」フラグを付けてコンパイルすることを忘れないでください。

于 2012-04-25T11:06:25.423 に答える