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に示します。47.0のfloat表現を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 に答える