1

当我编译我的代码时,它显示了 3 个警告:

warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ 
warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’
 warning: format ‘%hhu’ expects argument of type ‘int’, but argument 3 has type ‘unsigned char *’ 

这是代码:

typedef struct
{
int c; 
int l; 
unsigned char **matrizPixels; 
} PGM;

 void salvaPGM(PGM *img, char* saida)

 {
int i,j;

FILE *arq;

arq = fopen(saida,"w");

fprintf(arq,"P2\n");
fprintf(arq,"%d ", &img->c);
fprintf(arq,"%d ", &img->l);
fprintf(arq,"255\n");

for(i = 0; i++; i < img->l )
{
    for (j = 0; j++; j < img->c)
    {
        fprintf(arq,"%hhu ",&img->matrizPixels[i][j]);
    }
     fprintf(arq,"\n");
}

   fclose (arq);
 }
4

4 回答 4

2

您有多个printf格式字符串和参数不匹配的语句。这些不匹配将导致您的程序具有未定义的行为,因此编译器会警告您。你需要改变:

fprintf(arq,"%d ", &img->c);
fprintf(arq,"%d ", &img->l);

至:

fprintf(arq,"%d ", img->c);
fprintf(arq,"%d ", img->l);

后来:

    fprintf(arq,"%hhu ",&img->matrizPixels[i][j]);

至:

    fprintf(arq,"%d ",img->matrizPixels[i][j]);

我删除了hh最后一个,因为它是不必要的。我也从 更改%u%d以匹配将要发生的默认参数提升。

顺便说一句,您的循环表达式似乎for顺序错误。有点奇怪:

for(i = 0; i++; i < img->l )

我希望你的意思是:

for(i = 0; i < img->l; i++)
于 2013-08-30T21:35:54.047 回答
0

删除&as %dis used int

像这样的东西: -

fprintf(arq,"%d ", img->c);
fprintf(arq,"%d ", img->l);

 fprintf(arq,"%hhu ",img->matrizPixels[i][j]);
于 2013-08-30T21:33:56.853 回答
0

printf格式字符串指定一个int,但您提供的是一个,int *一个指向 的指针int

您需要将&变量放在前面。&x结果是一个指向 的指针x,你只是想要x

于 2013-08-30T21:35:12.693 回答
0

img是指向 PGM 结构的指针。该语句img->c取消引用指针并寻址 PGM 中的 c 变量。您还可以编码:(*img).c括号是必需的,因为取消引用运算符*的优先级非常低,并且您希望将其绑定到,img以便 *img 是一个取消引用的结构。

& 是地址运算符,它创建一个指针。该语句&img->c产生一个指向 的指针c,但 printfc不需要指向它的指针。

因此,写img->c(根据其他答案)或(*img).c

于 2013-08-30T22:26:13.073 回答