2016-10-28 27 views
-1

私はCプログラミングで新しく、2つの.datファイルから画像を取得し、等しい。ファイルには最初にいくつかのイメージがあります。すべての画像が同じ場合は1を返す必要があります。 .datファイルの一つのc-format "%d"は 'int *'型の引数を受け取りますが、引数3はint型です

ピック:

F1.dat

最初の20は、画像の20 "グループ" を意味します。 3 4は3x4行列を意味し、残りは行列になります。他の19個の行列と同じです。

最初のファイルの最初の行列ともう1つのファイルの最初の行列などを比較する必要があります。私はそのようなコードか何かを理解するためにあなたを必要としません

#include <stdio.h> 
#include <stdlib.h> 

struct irudia{ 
    int w,h; 
    unsigned char im[16][16]; 
}; 

int berdinak (struct irudia *im1, struct irudia *im2){ 
int berdin = 1; 
if ((im1->w != im2->w) || (im1->h != im2->h)){ 
    return 0; 
} 
for (int i = 0; i < im1 -> h; i++){ 
    for (int j = 0; j < im1 -> w; j++){ 
     if (im1->im[i][j] != im2->im[i][j]){ 
      berdin = 0; 
     } 
    } 
} 
return berdin; 
} 

int main (int argc, char *argv[]){ 
int n1, n2; 
int berdin = 1; 
struct irudia i1, i2; 
if (argc != 3){ 
    printf("Errorea parametroetan. Programa amaitu da.\n"); 
    exit(-1); 
} 
FILE *fitx1 = fopen(argv[1], "r"); 
FILE *fitx2 = fopen(argv[2], "r"); 
fscanf(fitx1, "%d", &n1); 
fscanf(fitx2, "%d", &n2); 
if (n1 != n2){ 
    return 0; 
} 
struct irudia *p1 = &i1; 
struct irudia *p2 = &i2; 
while (!feof(fitx1) && berdin == 1){ 
    fscanf (fitx1, "%d", &i1.h); 
    fscanf (fitx1, "%d", &i1.w); 
    fscanf (fitx2, "%d", &i2.h); 
    fscanf (fitx2, "%d", &i2.w); 
    for (int i = 0; i < i1.h; i++){ 
     for (int j = 0; j < i1.w; j++){ 
      fscanf (fitx1, "%d", (unsigned char)(i1.im[i][j])); 
     } 
    } 
    for (int i = 0; i < i2.h; i++){ 
     for (int j = 0; j < i2.w; j++){ 
      fscanf (fitx2, "%d", (unsigned char)(i2.im[i][j])); 
     } 
    } 
    berdin = berdinak (p1, p2); 
} 
    fclose (fitx1); 
    fclose (fitx2); 
    return berdin; 
} 

これは私が書いたコードです。私は警告を取得していますなぜ私は

fscanf (fitx1, "%d", (unsigned char)(i1.im[i][j])); 
+1

警告は非常にはっきりとわかります。 '%d'は変数argに' int * 'を必要としますが、' int * 'ではない' i1.im [i] [j] 'を与えました。そして、不必要なキャストをしないでください。 – kaylum

+0

タイトルに記載されているエラーが発生しない* 'fscanf()'はポインタを渡す必要があります。あなたは 'unsigned char'を渡していて、自動的に' int'に昇格します。 –

+0

i1.im [i] [j] => i1.im [i] + jそしてストップキャスト! – Stargateur

答えて

2

fscanfが提供されたアドレスに値を読み込み、実行するとき、私は知っている必要があります。警告はあなたの友人です。その特定の警告が表示されるのは、コンパイラがアドレスとしてi1.im[i][j]の値を解釈し、スキャンした値を内部に入れるために逆参照しようとしているからです。可能性の高い結果はセグメンテーションです。

代わりにしてみてください:これらの行で

fscanf (fitx1, "%hhu", &(i1.im[i][j])); 
+1

'i1.im [i] [j]'は 'unsigned char'型を持っているからです。 OPのキャストは不要だった。 –

+0

ああ、%cに更新します –

+0

'%hhu'を使って' unsigned char'を読み込みます。 –

1

fscanf (fitx1, "%d", (unsigned char)(i1.im[i][j])); 
... 
fscanf (fitx2, "%d", (unsigned char)(i2.im[i][j])); 

をあなたがint変数のアドレスを渡すことになっているが、あなたはそれが既にある型にキャストされ、そのアドレスではありません。

あなたのデータ unsigned char型であるが、あなたが数値であることをそのつもりなら、私はその範囲を確認し、一時的int変数へのご入力を示唆し、お使いのアレイに割り当てます。

また、Why is “while (!feof (file))” always wrong?を参照してください。

+0

私は今、何の警告も出さなかった。すべてのものの代わりに&xを入れて割り当てました。 – Unknown

+0

送信した!feofリンクを確認します。ありがとう! – Unknown

+0

'feof'はよく誤解されているC関数です。 –