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

imgPGM 構造体へのポインタです。このステートメントimg->cは、ポインターを逆参照し、PGM 内の c 変数をアドレス指定します。コード化することもできます:(*img).c逆参照演算子*の優先順位は非常に低くimg、*img が逆参照構造になるようにバインドする必要があるため、かっこが必要です。

& はアドレス演算子であり、ポインターを作成します。このステートメント&img->cは へのポインターを生成しますがc、printf はcそれへのポインターを必要としません。

img->cしたがって、 (他の回答ごとに)書くか、(*img).c

于 2013-08-30T22:26:13.073 に答える
0

printfフォーマット文字列は を指定していますが、 へのポインタをint提供しています。int *int

&変数の前にドロップする必要があります。&xへのポインタになります。x必要なのは だけですx

于 2013-08-30T21:35:12.693 に答える