将大量数据从FORTRAN传递到C ++

时间:2013-05-18 00:48:28

标签: c++ c fortran

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

我试过管道。我跟着http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx了解了C ++部分。但对于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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

使用二进制文件可能是最慢的方式。之前遇到过这个问题:

https://en.wikipedia.org/wiki/Inter-process_communication

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这里答案的一个小变体:Write unformatted (binary data) to 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 module使它比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)

在写这样的时候,我从未遇到过“不可打印的角色”的问题。 你不能使用这个技巧从fortran中的stdin读取,因为随机字符串被解释为EOF。