C初始化结构错误数组

时间:2015-12-26 19:08:45

标签: c arrays struct

我正在尝试在struct中初始化int数组但是当我从scanf获取值然后访问值时,它会给我warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]错误。这是我的代码:

struct maclar {
    int macNo[40];
    int evSahibi[40];
    int deplasman[40];
} mac[40];

void verileriAl(FILE *mp) {
    for (int i = 0; fscanf(mp,"%d %d %d",
                           mac[i].macNo, mac[i].evSahibi, mac[i].deplasman) != -1; i++) {
        ........codes here .....
    }
}

main() {
    FILE *mp = fopen("maclar.txt", "r");
    verileriAl(mp);
    printf("%d\n", mac[0].macNo);  //give me warning and wrong value
}

4 个答案:

答案 0 :(得分:3)

您正在为static void test(){ float projectionMatrix[16]; // width and height of viewport to display on (screen dimensions in case of fullscreen rendering) float ratio = (float)width/height; float left = -ratio; float right = ratio; float bottom = -1.0f; float top = 1.0f; float near = -1.0f; float far = 100.0f; frustum(projectionMatrix, 0, left, right, bottom, top, near, far); } static void frustum(float *m, int offset, float left, float right, float bottom, float top, float near, float far) { float r_width = 1.0f / (right - left); float r_height = 1.0f / (top - bottom); float r_depth = 1.0f / (far - near); float x = 2.0f * (r_width); float y = 2.0f * (r_height); float z = 2.0f * (r_depth); float A = (right + left) * r_width; float B = (top + bottom) * r_height; float C = (far + near) * r_depth; m[offset + 0] = x; m[offset + 3] = -A; m[offset + 5] = y; m[offset + 7] = -B; m[offset + 10] = -z; m[offset + 11] = -C; m[offset + 1] = 0.0f; m[offset + 2] = 0.0f; m[offset + 4] = 0.0f; m[offset + 6] = 0.0f; m[offset + 8] = 0.0f; m[offset + 9] = 0.0f; m[offset + 12] = 0.0f; m[offset + 13] = 0.0f; m[offset + 14] = 0.0f; m[offset + 15] = 1.0f; } 格式传递intprintf的数组,因此格式不匹配。使用适当的警告编译是一件好事,否则这个错误就会被忽视。

为什么你的结构为每个成员保留40个值的数组?

这可能是一个错误,出于混乱。

以这种方式修复您的代码:

%d

答案 1 :(得分:1)

原因是您传递的mac[i].macNo转换为int *类型。 %d期望int类型参数。

另请注意,您在fscanf中犯了同样的错误。一种可能的解决方案是将mac声明为

struct maclar
{
    int macNo[40];
    int evSahibi[40];
    int deplasman[40];
}mac;  

现在将for语句更改为

for (int i = 0; fscanf(mp,"%d %d %d",mac.macNo[i],mac.evSahibi[i],mac.deplasman[i]) != -1 ; i++)  

并将printf调用更改为

printf("%d\n", mac.macNo[0]);

答案 2 :(得分:0)

  1. 因为scanf的格式%d只读取一个 int,但您尝试将此值分配给int的数组。如果不指定索引,则无法将值放入数组中。*

    编辑:实际上,该值只会被放入第一个索引,因为 int * 已经过评估。

  2. 正如haccks回答:真正的问题是printf,因为它需要int类型的参数而不是int *

答案 3 :(得分:0)

关于这一行:

printf("%d\n", mac[0].macNo);

字段macNoint

的数组

在C中,对数组名称的引用会降级为数组第一个字节的地址。

所以这个:mac[0].macNo会产生一个地址。

格式说明符:%d无法正确处理地址。

建议:

printf("%p\n", mac[0].macNo);

因为%p专门用于打印地址