从文件中读取MKL_INT时的特殊行为

时间:2015-08-22 20:27:51

标签: c gcc intel-mkl

当尝试将文件中的单个整数值读入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导致程序按预期无条件地运行到最后一行......

我的系统详情

  • 操作系统:Ubuntu 14.04
  • 编译:GCC 4.8
  • MKL:11 v3

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

1 个答案:

答案 0 :(得分:1)

这可能是由于readFile函数中的格式说明符错误。

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

long long int用“%ll”读取,__ int64用“%I64d”读取。因此,您需要检查系统中MKL_INT的确切位置。