FORTRAN到C ++和C ++到FORTRAN通信

时间:2014-05-23 09:31:08

标签: c++ sockets fortran g77

我有一个C ++应用程序和FORTRAN应用程序,它们通过文件进行通信。 (两个方向)

FORTRAN应用程序正在将数据写入文件,而C ++正在从文件中读取数据。 现在出现了一个新的要求,我必须用C ++代码格式FORTRAN和从FORTRAN到C ++直接进行通信(因为文件操作很昂贵)。 我在C ++端实现了socket,并尝试在FORTRAN端实现套接字。我是 没有在互联网上获得关于FORTRAN套接字的足够信息。

FORTRAN遗留代码是用g77编写的。 C ++在MFC中。

  1. 除插座之外,还有更好的方法来实现这一目标     通讯?
  2. 使用g77关于FORTRAN套接字的任何链接都会有所帮助。
  3. 我知道,我不应该在这个论坛上要求链接。如果这个问题不属于这个论坛,我可以在哪里提出这样的问题?

1 个答案:

答案 0 :(得分:0)

如果通信只是单向通信,则可以使用命名管道甚至是匿名管道。

与所有进程间通信一样,有一些问题。

您最好的选择是使用未格式化的流。这是Fortran 2003中引入的一个相对较新的功能,但所有主要编译器都支持它。所以,用

打开你的文件
  OPEN(20,file="myfifo",access="stream",form="unformatted",status="old",action="write")

并使用

之类的语句写入
    WRITE (20) A

为什么没有格式化流?

首先,未格式化:你写的速度在你的情况下很重要。将数字转换为十进制并再次返回需要花费大量CPU周期,并且可能也会失去准确性。

其次,流:Fortran使用未格式化I / O的常规实现使用记录标记 - 记录显示记录长度之前的标记,记录显示相同信息的标记。

运行时系统如何知道它要写的记录有多长?嗯,事实并非如此。因此,常见的实现是编写虚拟记录标记,写入记录(并了解它的长度),写入尾随标记,搜索第一个标记,覆盖虚拟记录标记,然后继续。这对命名管道不起作用 - 你不能在那里寻找。如果你还在缓冲区内,你可能会很幸运,但你不能依赖它。

关于编译器:如果与旧g77代码兼容是一个问题,请使用gfortran。它支持ACCESS="STREAM"并且具有g77的大部分扩展。 g77已经过时了很长时间没有得到支持。