我正在尝试在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
}
答案 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;
}
格式传递int
到printf
的数组,因此格式不匹配。使用适当的警告编译是一件好事,否则这个错误就会被忽视。
为什么你的结构为每个成员保留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)
因为scanf的格式%d
只读取一个 int
,但您尝试将此值分配给int
的数组。如果不指定索引,则无法将值放入数组中。*
编辑:实际上,该值只会被放入第一个索引,因为 int *
已经过评估。
正如haccks回答:真正的问题是printf,因为它需要int
类型的参数而不是int *
。
答案 3 :(得分:0)
关于这一行:
printf("%d\n", mac[0].macNo);
字段macNo
是int
在C中,对数组名称的引用会降级为数组第一个字节的地址。
所以这个:mac[0].macNo
会产生一个地址。
格式说明符:%d
无法正确处理地址。
建议:
printf("%p\n", mac[0].macNo);
因为%p
专门用于打印地址