当我编译我的代码时,它向我显示了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);
}
答案 0 :(得分: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++)
答案 1 :(得分:0)
删除&
,因为%d
使用了int
这样的事情: -
fprintf(arq,"%d ", img->c);
fprintf(arq,"%d ", img->l);
和
fprintf(arq,"%hhu ",img->matrizPixels[i][j]);
答案 2 :(得分:0)
printf
格式字符串指定int
,但您提供int *
,指向int
的指针。
您需要将&
放在变量前面。 &x
会生成指向x
的指针,您只需要x
。
答案 3 :(得分:0)
img
是指向PGM结构的指针。语句img->c
取消引用指针并解决PGM中的c变量。你也可以编写代码:(*img).c
parens是必要的,因为解除引用运算符*
的优先级非常低,你希望它绑定到img
,以便* img是一个解引用的结构。
&安培;是地址运算符,它创建一个指针。语句&img->c
生成指向c
的指针,但printf希望c
不是指向它的指针。
因此,请写img->c
(其他答案)或(*img).c