2

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

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

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

  1. 除了套接字通信之外,还有更好的方法来实现这一点吗?
  2. 任何有关使用 g77 的 FORTRAN 上的套接字的链接都会有所帮助。

我知道,我不应该在这个论坛上要求链接。如果这个问题不属于这个论坛,我在哪里可以问这种问题?

4

1 回答 1

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 已经很老了,已经好几年没有得到支持了。

于 2015-02-12T17:49:58.583 回答