0

错误:从 'void*' 转换为 'unsigned int' 失去精度

错误:从 'unsigned int' 到 'unsigned int**' 的无效转换

你能告诉我如何正确地转换这个吗,我在这条线上遇到了错误:

颜色 = (unsigned int)malloc(height*sizeof(unsigned int));

在主函数里面。

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

unsigned int width;
unsigned int height;
unsigned int **color = NULL;

bool file_write()
{
     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 true;
}
int method(int x, int y, 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;
}


void method1(double min_re, double max_re, double min_im, double max_im, int max_iterations)
{  
    for(int x = 0; x < width; x++)
    {
            for(int y = 0; y < height; ++y)
            {
                    int m1 = method(x,y,min_re,max_re,min_im,max_im,max_iterations);
                    if(m1)
                    {
                            color[x][y] = m1*50;
                    }
            }
    }
}
int main(int argc, char *argv[])
{
     unsigned int max_iterations;
     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);
method1(min_re, max_re, min_im, max_im, max_iterations);
time(&te);
double diff = difftime(te,ts);
file_write();
printf("Total Time elapsed: %f\n",diff);
return 0;
}
4

3 回答 3

3

为什么要将 malloc 的返回值转换为 an unsigned int

首先,不要在 C 中强制转换 malloc 的返回值。这是没有意义的,实际上可以隐藏您忘记包含的事实。在这方面,C 不是 C++。void* 可以隐式转换为 C 中的任何指针类型。

其次,malloc返回一个指针,并且您已定义colorunsigned int**... 但您尝试将 anunsigned int和 an分配unsigned int*给它。显然这些是不相容的。只需放下演员表并正确使用/声明类型。

于 2012-04-26T20:03:28.723 回答
2
color = (unsigned int**)malloc(height*sizeof(unsigned int*));

不应该是这个吗?

于 2012-04-26T19:59:08.847 回答
0

您正在尝试动态分配指针数组。所以你需要做的是以下几点:

color = (unsigned int**)malloc(height*sizeof(unsigned int));

其余的都很好...

于 2018-03-07T05:59:51.537 回答