2

我的名为“a.txt”的文件包含一个数字 ( 47)。

如果我在没有使用 MPI 的编译器上运行程序,fscanf(a,"%f",&num)它会给出一个真值 nnum = 47

如果我使用 MPI ssh 运行程序,它不会返回正确的值。它将返回 num = 1104187136

为什么是这样?

int main(int argc, char *argv[]){
  int count;
  FILE *a1;
  float a;
  int num;

  a1 = fopen("a1.txt","r");


  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD,&numOfProc);
  MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);

  if(my_rank == 0){     
    fscanf(a1,"%f",&num);
    a = num;
    printf("a = %d",a);
  }

  MPI_Finalize();
}
4

1 回答 1

3

我认为这里的问题不是 MPI,甚至不是fscanf;问题是使用 fscanf。如果您在打开警告的情况下进行编译,您将收到几个有关格式代码的警告。

首先,您有:

int num;
fscanf(a1,"%f",&num);

它试图将数字作为浮点数读入,然后给它一个指向 int 的指针来存储它。printf/scanf 格式的代码有点搞笑;它们不仅向 fscanf 指示如何解析输入,还向 fscanf 指示以何种表示形式保存结果。如果您尝试将 47.0 的浮点表示复制到 int 变量中,您将得到:

int num;
float a;

a = 47.0;
*(float *)&num = a;

printf("num = %d\n", num);
...

num = 1111228416 

printf 也会出现同样的问题:

a = num;
printf("a = %d",a);

在这里,您将 num 中的值分配给 a,这很好,编译器将在那里插入类型转换,但随后您将该值解释为 int 并将其打印出来,因此您会在那里得到另一个表示/值不匹配。

所以我认为在你的代码中你想要:

fscanf(a1,"%f",&a);
printf("a = %f",a);

或者

fscanf(a1,"%d",&num);
printf("num = %d",num);

但不是您拥有它们的转换方式。

于 2012-11-04T16:43:44.860 回答