0
votes

error: cast from 'void*' to 'unsigned int' loses precision

error: invalid conversion from 'unsigned int' to 'unsigned int**'

can u tell me how to properly cast this, i am getting error on this line:

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

inside the main function.

#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;
}
3
This ain't C++ code, but C !!DumbCoder

3 Answers

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

Shouldn't it be this?

3
votes

Why are you casting the return value of malloc to an unsigned int?

First off, don't cast the return value of malloc in C. It is pointless and can actually hide the fact that you forgot to include . C is not C++ in this regard. A void* can be implicitly converted to any pointer type in C.

Secondly, malloc returns a pointer, and you have defined color as an unsigned int**... yet you attempt to assign an unsigned int as well as an unsigned int* to it. Obviously those are incompatible. Just drop the casts and use/declare the type properly.

0
votes

You are trying to allocate array of pointers dynamically. So what you need to do is the following:

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

Rest of it is fine ...