последовательное создание изображения Мандельброта

может ли кто-нибудь сказать мне, что не так в этом коде?

я получаю сообщение об ошибке в основной функции, когда я вызываю функцию метода "file_write" внутри основной функции, она говорит, что "y" не объявлен в этой области, но на самом деле это был аргумент, который я передал в функция метода ранее.

это серьезная ошибка?

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

unsigned int width = 1500;
unsigned int height = 1500;
unsigned int max_iterations = 30000;
unsigned int **color = NULL;
double threshold = 4;
double min_re = -2.0;
double max_re = 1.0;
double min_im = -1.2;
double max_im = min_im+(max_re-min_re)*height/width;
double x_factor = (max_re-min_re)/(width-1);
double y_factor = (max_im-min_im)/(height-1);

int file_write(int x, int y, double min_re, double max_im, double x_factor, double y_factor)
{
    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,"255\n");
 unsigned int R = 0, G = 0, B = 0;
 for(unsigned y = 0; y < height; ++y)
 {
            double c_im = max_im - y*y_factor;
    for(unsigned x = 0; x < width; ++x)
    {
            double c_re = min_re + x*x_factor;
            double Z_re = c_re, Z_im = c_im;
            bool image_inside = true;
         R = 0, G = 0, B = 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)
                       {
                          image_inside = false;
                G = n;
                if(G == 10)
                {
                    G = 25, R = 10, B = 5;
                }
                           break;
                          }
                          Z_im = 2 * Z_re * Z_im + c_im;
                          Z_re = Z_re2 - Z_im2 + c_re;
                 }
            if(image_inside)
        {
            putc(R, fractal);
            putc(G, fractal);
            putc(B, fractal);
        }
        else
        {
            putc(R, fractal);
            putc(G, fractal);
            putc(B, fractal);
        }
          }
}
fclose(fractal);
return 0;
}
}
int main(int argc, char *argv[])
{
if(argc != 9)
{
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]);
}
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\t\n",height,width,max_iterations,min_re,max_re,min_im,max_im,threshold);
int x;
for(x = 0; x < height; x++)
{
color[x] = (unsigned int*)malloc(width*sizeof(unsigned int));
}
time_t ts,te;
time(&ts);
file_write(x,y,min_re,max_im,x_factor,y_factor);
time(&te);
double diff = difftime(te,ts);
printf("Total Time elapsed: %f\n",diff);
for(x = 0; x < height; x++)
{
   free(color[x]);
}
free(color);
return 0;
}

person visanio_learner    schedule 21.03.2012    source источник
comment
В зависимости от условий эта ошибка может быть связана с тем, что компилятор жалуется на тот факт, что у вас есть параметр с именем «y», а переменная, которую вы используете в своем первом цикле for, также называется «y».   -  person Kaganar    schedule 21.03.2012
comment
Я вижу, что в main() используется переменная 'y', но нигде не вижу ее объявления.   -  person SirDarius    schedule 21.03.2012
comment
на самом деле я использовал x и y в качестве параметра в «функции file_write», вносит ли это какие-либо изменения для повторного использования переменной int x в основной функции   -  person visanio_learner    schedule 21.03.2012
comment
@SirDarius, но я объявил «y» в функции «file_write»   -  person visanio_learner    schedule 21.03.2012
comment
@visanio_learner ошибка возникает в «main», как вы сами сказали, а не в file_write ... переменные являются локальными для функций, в которых они объявлены. Это также верно для параметров, они действительны только в той функции, в которой они объявлены внутри, а не вокруг.   -  person SirDarius    schedule 21.03.2012
comment
большое спасибо, я объявил это глобально, и я получил результаты   -  person visanio_learner    schedule 21.03.2012


Ответы (1)


Когда вы вызываете file_write(x,y,min_re,max_im,x_factor,y_factor);, переменная y не определена.

x содержит значение, которое вам не нужно (height, что является нечетным значением для x).

Решение состоит в том, чтобы удалить два параметра из вызова функции. Переменные являются локальными для file_write() (= они никогда не считываются до того, как значение будет перезаписано) и не нуждаются в раскрытии в main().

person Aaron Digulla    schedule 22.03.2012