Fortran中的奇怪字符写输出

时间:2015-10-23 19:06:34

标签: io formatting fortran mpi

我想计算一些子程序。这是我用来写名称和执行持续时间的模板:

 <DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
    <DataTrigger Binding="{Binding Sex}" Value="Male">
    <Setter Property="Background" Value="Blue"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding Sex}" Value="Female">
    <Setter Property="Background" Value="Red"/>
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </DataGrid.RowStyle>

这是一个示例输出:

SUBROUTINE get_sigma_vrelp

  ...declarations...

  real(8) :: starttime, endtime
  CHARACTER (LEN = 200) timebuf
  starttime = MPI_Wtime()

  ...do stuff...

  endtime = MPI_Wtime()
  write (timebuf, '(30a,e20.10e3)') 'get_sigma_vrelp',endtime-starttime
  call pout(timebuf)
END SUBROUTINE get_sigma_vrelp

为什么打印一个奇怪的字符而不是endtime-starttime的数值?顺便说一句,pout()只是以线程安全的方式将缓冲区写入特定于进程的文件。它不应该与问题有任何关系,但是如果这里没有其他任何东西可以导致错误输出,那么我可以发布它的正文。

1 个答案:

答案 0 :(得分:3)

你错了方向!该行应为

write (timebuf, '(a30,e20.10e3)') 'get_sigma_vrelp',endtime-starttime

这样,您需要一个长度为30个字符(a30)的字符串,而不是30个任意长度的字符串(30a)。 write语句在第一个字符串后不接收字符,而是浮点数的相应字节。因此垃圾。

你的角色字面只有15个字符长,所以你可以把这行写成

write (timebuf, '(a15,e20.10e3)') 'get_sigma_vrelp',endtime-starttime

或让编译器自行决定长度:

write (timebuf, '(a,e20.10e3)') 'get_sigma_vrelp',endtime-starttime