【问题标题】:c- format "%d" expects argument of type 'int *', but argument 3 has type intc- 格式 "%d" 需要类型为“int *”的参数,但参数 3 的类型为 int
【发布时间】:2016-10-28 20:01:51
【问题描述】:

我是 C 编程新手,我需要从两个 .dat 文件中获取图像并比较它们是否相等。这些文件首先有图像的数量,然后是一些图像。如果所有图像都相同,我需要返回 1。

其中一个 .dat 文件的图片:

F1.dat

前 20 个表示 20 个图像“组”。 那么 3 4 将意味着 3x4 矩阵,其余的将是矩阵。其他 19 个矩阵也是如此。

我需要将第一个文件的第一个矩阵与另一个文件的第一个矩阵进行比较,依此类推。

这是我写的代码:

#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]));

【问题讨论】:

  • 警告告诉你很清楚。 %d 需要 int * 用于变量 arg,但您给了它 i1.im[i][j],它不是 int *。并且不要做不必要的演员表。
  • 为什么您希望得到标题中给出的错误? fscanf() 要求你传递一个指针;你传递了一个unsigned char,自动提升为int
  • i1.im[i][j] => i1.im[i] + j 并停止施法!
  • 读一本好的C教材,它会教你如何正确使用scanf()

标签: c image int compare warnings


【解决方案1】:

fscanf 将值读入提供的地址。警告是你的朋友。您收到该特定警告是因为编译器告诉您它将把 i1.im[i][j] 的值解释为地址并尝试取消引用它以便将扫描的值放入其中。可能的结果是段错误。

改为尝试:

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

【讨论】:

  • 不完全是,因为i1.im[i][j] 的类型为unsigned char。 OP 的演员阵容是不必要的。
【解决方案2】:

在这些行中

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

您应该传递int 变量的地址,但您正在转换为它已经是的类型,而不是地址。

您的数据 是无符号字符,但如果您打算将其作为数值,我建议您输入一个临时的 int 变量,检查其范围,然后将其分配给您的数组。

另外,请参阅Why is “while ( !feof (file) )” always wrong?

【讨论】:

  • 我现在没有收到任何警告。而不是我放 &x 然后我分配的所有内容。
  • 我会检查您发送的 !feof 链接。谢谢!
  • feof 是一个经常被误解的 C 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多