2013-08-30 50 views
1

當我編譯我的代碼,它讓我看到3個警告:警告:格式「%d」需要類型「詮釋」的說法,但參數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

這意味着正是它說。它需要一個'int',但你傳遞給它一個'int *'。 –

+0

除非您嘗試打印地址,否則在printf()的參數前面不需要'&'? –

+0

兩個upvotes。我猜這是再次沒有閱讀編譯器消息日的獎勵! – 2013-08-30 22:24:26

回答

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++) 
0

刪除該&%d使用INT

事情是這樣的: -

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

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

printf格式字符串指定的int,但是你提供的是int *,一個指向int

您需要將&放在變量前面。 &x的結果是指向x,您只需要x

0

img是一個指向PGM結構。語句img->c取消引用指針並解決PGM中的c變量。您還可以編碼:(*img).c parens是必需的,因爲解引用運算符*的優先級非常低,並且您希望它綁定到img,因此* img是取消引用的結構。

&是地址運算符,它創建一個指針。語句&img->c產生一個指向c的指針,但是printf想要c不是指向它的指針。

因此,寫img->c(每其他答案)或(*img).c

相關問題