从文件中读取 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

我观察到以下

到目前为止,我唯一的线索是编译器标志似乎在这里发挥了作用:从标志中删除 -DMKL_ILP64 -m64 导致程序 运行 无条件地出现在最后一行。 ..

我的系统详细信息是

我以前从未经历过这样的行为,很想知道这里到底发生了什么。

这可能是因为您的 readFile 函数中的格式说明符错误。

在我header手头MKL_INT == MKL_INT64 == long long int或__int64。 要读取这些整数,您需要使用正确的格式说明符,否则它是未定义的行为。

long long int 用“%ll”读取,__int64 用“%I64d”读取。因此,您需要检查系统上的 MKL_INT 到底是什么。