gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:15:32 25 4
gpt4 key购买 nike

当试图从文件中读取单个整数值到类型为 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 导致程序按预期无条件地运行最后一行。 ..

我的系统详细信息是

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

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

最佳答案

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

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

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

关于c - 从文件中读取 MKL_INT 时的特殊行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com