从文件中读取 MKL_INT 时的特殊行为
Peculiar behavior when reading an MKL_INT from a file
当我试图从一个文件中读取一个整数值到一个 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
声明的最后一行存在,a 似乎就可以正确地从文件中读取,并且在两次比较中都会产生 true
- 一旦我注释掉最后一行,两次比较都会产生
false
到目前为止,我唯一的线索是编译器标志似乎在这里发挥了作用:从标志中删除 -DMKL_ILP64 -m64
导致程序 运行 无条件地出现在最后一行。 ..
我的系统详细信息是
- OS: Ubuntu 14.04
- 编译器:GCC 4.8
- MKL:11 v3
我以前从未经历过这样的行为,很想知道这里到底发生了什么。
这可能是因为您的 readFile 函数中的格式说明符错误。
在我header手头MKL_INT == MKL_INT64 == long long int或__int64。
要读取这些整数,您需要使用正确的格式说明符,否则它是未定义的行为。
long long int 用“%ll”读取,__int64 用“%I64d”读取。因此,您需要检查系统上的 MKL_INT 到底是什么。
当我试图从一个文件中读取一个整数值到一个 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
声明的最后一行存在,a 似乎就可以正确地从文件中读取,并且在两次比较中都会产生true
- 一旦我注释掉最后一行,两次比较都会产生
false
到目前为止,我唯一的线索是编译器标志似乎在这里发挥了作用:从标志中删除 -DMKL_ILP64 -m64
导致程序 运行 无条件地出现在最后一行。 ..
我的系统详细信息是
- OS: Ubuntu 14.04
- 编译器:GCC 4.8
- MKL:11 v3
我以前从未经历过这样的行为,很想知道这里到底发生了什么。
这可能是因为您的 readFile 函数中的格式说明符错误。
在我header手头MKL_INT == MKL_INT64 == long long int或__int64。 要读取这些整数,您需要使用正确的格式说明符,否则它是未定义的行为。
long long int 用“%ll”读取,__int64 用“%I64d”读取。因此,您需要检查系统上的 MKL_INT 到底是什么。