C 警告:格式‘;%d’;应为类型为‘;int’;,但参数3的类型为‘;int*’;
当我编译代码时,它会显示3个警告:C 警告:格式‘;%d’;应为类型为‘;int’;,但参数3的类型为‘;int*’;,c,warnings,C,Warnings,当我编译代码时,它会显示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 a
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);
}
typedef结构
{
INTC;
int l;
无符号字符**矩阵像素;
}PGM;
无效salvaPGM(PGM*img,char*saida)
{
int i,j;
文件*arq;
arq=fopen(saida,“w”);
fprintf(arq,“P2\n”);
fprintf(arq、%d、&img->c);
fprintf(arq、%d、&img->l);
fprintf(arq,“255\n”);
对于(i=0;i++;il)
{
对于(j=0;j++;jc)
{
fprintf(arq、%hhu、&img->matrizPixels[i][j]);
}
fprintf(arq,“\n”);
}
fclose(arq);
}
在使用%d
时,删除&
大概是这样的:-
fprintf(arq,"%d ", img->c);
fprintf(arq,"%d ", img->l);
及
printf
格式字符串指定了一个int
,但您提供了一个int*
,一个指向int
的指针
您需要将和放在变量前面&x
导致指向x
的指针,您只需要x
您有几个printf
语句,它们的格式字符串和参数不匹配。这些不匹配将导致程序具有未定义的行为,因此编译器会警告您。您需要更改:
fprintf(arq,"%d ", &img->c);
fprintf(arq,"%d ", &img->l);
致:
后来:
fprintf(arq,"%hhu ",&img->matrizPixels[i][j]);
致:
我删除了上一个中的hh
,因为它是不必要的。我还将%u
更改为%d
,以匹配将发生的默认参数提升
另一方面,您的for
循环表达式的顺序似乎不正确。有点奇怪:
for(i = 0; i++; i < img->l )
(i=0;i++;il)
我想你的意思是:
for(i = 0; i < img->l; i++)
(i=0;il;i++)的
img
是指向PGM结构的指针。语句img->c
取消对指针的引用,并在PGM中寻址c变量。您还可以编写代码:(*img).c
由于解引用运算符*
的优先级非常低,您希望将其绑定到img
,以便*img是一个解引用结构,因此必须使用paren
&是地址运算符,它创建指针。语句&img->c
生成指向c
的指针,但printf希望c
不是指向它的指针
因此,写img->c
(根据其他答案)或(*img)。c
它的意思就是它所说的。它需要一个int
,但您正在传递一个int*
。除非您试图打印地址,否则在printf()
的参数前面不需要&
。我想这是对今天没有再次阅读编译器消息日的奖励!
fprintf(arq,"%d ",img->matrizPixels[i][j]);
for(i = 0; i++; i < img->l )
for(i = 0; i < img->l; i++)