2012-04-25 1 views
-2

Я пытаюсь получить изображение mandelbrot четко с последовательным программированием на 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; 
} 

Как исправить эту ошибку сегментации?

+1

Пусть ваш отладчик найдет место segfault. – Anthales

+0

ОК, я попробую. –

+3

Я мог бы обнаружить одну проблему в вашем файле 'file_write': вы никогда не выделяете память для вашего' unsigned int ** color' или, скорее, вы не передали «цвет» из своей основной функции. – Anthales

ответ

2

По меньшей мере одна проблема заключается в функции file_write.

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

Я предполагаю, что цвет должен быть входной параметр.

+0

Могу ли я узнать, что является решением этой проблемы? –

+0

Несомненно. 1. 'int file_write (unsigned int width, unsigned int height, unsigned int ** color) {...}', 2. 'file_write (ширина, высота, цвет);'. Но есть еще одна проблема. Цвет выделяется в основном, а не инициализируется и нигде не используется, т. Е. Функция 'file_write' сохраняет что-то. – megabyte1024

+0

теперь я пытаюсь запустить его на компиляторе C вместо того, чтобы запускать его на C++, он показывает ошибку и примечание > ошибка: начальные объявления цикла для 'цикла' разрешены только в режиме C99. > примечание: используйте опцию -std = c99 или -std = gnu99 для компиляции вашего кода –

1

Если вы на Linux машине сделайте следующее:

$ulimit -c unlimited 

Затем запустите код. Обратите внимание на ядро. Создается файл [pid]. fire gdb, как указано ниже

$gdb ./your_app core.[pid] 

Он примет ваше заявление, где произошел segfault. выполните команду «backtrace» в приглашении gdb, чтобы увидеть иерархию вызовов.

Помните, что для компиляции с флагом -g необходимо получить более подробный вывод gdb.

+0

Я пытался запустить gdb, но он говорит, что нет такого файл или каталог ... –

+0

Какие аргументы вы предоставили gdb? вы находитесь в каталоге, где находится ваш бинарный файл? вы подтвердили существование «основного» файла? – Aftnix

+0

Да, я в моем каталоге ... –

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

Тогда, конечно, вы должны проверить возвращаемые значения malloc(), fopen(), fprintf(), fclose(), ..., и проверьте, что входные переменные имеют разумные значения и т.д. ,

Я также заметил, что вы передаете width и height в различных целях file_write() и method(). Чтобы избежать будущих головных болей, я бы изменил функцию method() на method(x, y, width, height) так, чтобы горизонтальные и вертикальные аргументы передавались в том же порядке.

 Смежные вопросы

  • Нет связанных вопросов^_^