当尝试将文件中的单个整数值读入MKL_INT
类型的变量时,我在程序中遇到了一些我无法理解的特殊行为。
此简短代码说明了问题:
#include <stdio.h>
#include <mkl_types.h>
void readFile(MKL_INT *a, char *fn)
{
FILE *fp;
fp = fopen(fn, "r");
fscanf(fp, "%d", a);
fclose(fp);
if(*a == 1)
printf("a == 1 in readFile()\n");
}
int main()
{
MKL_INT a;
char *fn = "data.dat";
readFile(&a, fn);
if(a == 1)
printf("a == 1 in main()\n");
/* Once the last line is commented out, (a == 1) in main() as well as
(*a == 1) in readFile() yield "false" */
MKL_INT b = 1;
return 0;
}
我使用的编译命令是
gcc -DMKL_ILP64 -m64 test.c -o test -I$MKLROOT -L$MKLROOT
文件data.dat
只包含
1
我观察以下
b
声明的最后一行,就可以正确读取文件,并在两次比较中产生true
false
我到目前为止唯一的线索是编译器标志似乎在这里发挥作用:从标志中删除-DMKL_ILP64 -m64
导致程序按预期无条件地运行到最后一行......
我的系统详情
我之前从未经历过这样的行为,并且很想知道这里到底发生了什么。
答案 0 :(得分:1)
这可能是由于readFile函数中的格式说明符错误。
在我的标题栏中MKL_INT == MKL_INT64 == long long int或__int64。 要读取这些整数,您需要使用正确的格式说明符,否则它是未定义的行为。
long long int用“%ll”读取,__ int64用“%I64d”读取。因此,您需要检查系统中MKL_INT的确切位置。