0

エラー:「void*」から「unsignedint」にキャストすると精度が失われます

エラー:「unsignedint」から「unsignedint**」への無効な変換

これを適切にキャストする方法を教えてもらえますか?この行でエラーが発生しています:

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

main関数内。

#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の戻り値をにキャストするのunsigned intですか?

まず、mallocの戻り値をCでキャストしないでください。これは無意味であり、を含めるのを忘れたという事実を実際に隠すことができます。この点で、CはC++ではありません。void *は、Cの任意のポインター型に暗黙的に変換できます。

次に、mallocポインタを返します。これは...として定義さcolorれていますが、それにだけでなくunsigned int**を割り当てようとしています。明らかに、それらは互換性がありません。キャストをドロップして、タイプを適切に使用/宣言するだけです。unsigned intunsigned 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 に答える