1

将大量数据(双数)从 FORTRAN 程序传递到 C++ 程序的最佳和最有效的方法是什么?现在我正在使用二进制文件,但速度不够快!

我试过管道。对于 C++ 部分,我关注了http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx 。但对于 FORTRAN 部分(即子处理器),我不知道如何正确写入数据。我必须在控制台上写WRITE(*,*) AllTheNumbers吗?因为在控制台上书写需要很多时间!

我写数据的 FORTRAN 代码:

        DO 281 I=1,NDOF 
        DO 280 J=1,UBW              
        IF (S(I,J).NE.0) THEN      
          WRITE (*, 2770) I,(J+I-1)
          WRITE (*,2760) (S(I,J))          
        ENDIF        
 280    CONTINUE         
 281    CONTINUE
4

3 回答 3

4

最快的方法是让它成为一个混合语言程序。在一种语言(例如,Fortran)中生成数字并从该语言调用另一种(例如,C++)。使用 Fortran 的 ISO C 绑定,调用 C 是 Fortran 语言标准的一部分。许多 Fortran 编译器都支持这一点。在 C++ 端使用“extern C”。传递一个双精度数组应该很容易。

编辑:如果您继续使用传输信息的 IO 方法,您可能应该将信息作为二进制数据传输。您的示例 Fortran 代码使用格式化的 IO ...将数字的内部二进制表示转换为人类可读的字符很慢。在您的 Fortran open 语句中使用:access='stream', form='unformatted'. 不要在写入时使用格式。

于 2013-05-18T01:13:41.950 回答
1

考虑创建一些共享内存。c 程序“创建它”,将数据写入其中,然后调用 fortran 子程序。fortran 程序“映射”共享内存,处理它并退出。然后 c 程序销毁内存并退出。

于 2013-05-18T01:38:49.787 回答
0

此处答案的一个小变体:将未格式化的(二进制数据)写入 stdout,说明了小缓冲区的重复使用。

  real(kind=8) :: x(256)    ! note real(kind=8) is "probably" an 8 byte float.
                            ! but not strictly guaranteed in fortran.
  character(len=2048)::  buffer  ! 2048 == 256*8
  do j=1,1000
     do i = 1,256
        x(i)=(i-1)**2+j*256
     enddo
     buffer=transfer(x,buffer)
     write(*,'(a)',advance='no')buffer
  enddo
  end

和 python 代码来读取它,例如。(python struct 模块使它比我认为调试这些东西的 c++ 更好)

import subprocess
import struct
p=subprocess.Popen('./transfer',stdout=subprocess.PIPE)
a=" "
while a!="":
a=p.stdout.read(8)
if a!="" :  print struct.unpack('d',a)

在这样写的时候,我从来没有遇到过“不可打印的字符”的问题。但是,由于随机的位串被解释为 EOF,因此您不能使用此技巧从 fortran 中的标准输入中读取。

于 2013-05-21T20:05:31.977 回答