我的名为“a.txt”的文件包含一个数字(47
)。
如果我使用fscanf(a,"%f",&num)
在没有MPI的编译器上运行程序,它会给出一个真值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();
}
答案 0 :(得分:3)
我认为这里的问题不是MPI,甚至是fscanf
;问题是使用fscanf。如果在编译时出现警告,则会收到有关格式代码的若干警告。
首先,你有:
int num;
fscanf(a1,"%f",&num);
尝试将数字作为浮点数读入,然后给它一个指向int的指针来存储它。 printf / scanf格式代码有点搞笑;它们不仅向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);
但不是你拥有它们的转换方式。