c++ - FORTRAN 到 C++ 和 C++ 到 FORTRAN 的通信

标签 c++ sockets fortran g77

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

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

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

  1. 除了套接字之外,是否有更好的方法来实现这一目标 沟通?
  2. 任何有关使用 g77 的 FORTRAN 套接字的链接都会有所帮助。

我知道,我不应该在这个论坛上索取链接。如果这个问题不属于这个论坛,我在哪里可以问这样的问题?

最佳答案

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

与所有进程间通信一样,存在一些陷阱。

最好的办法是使用未格式化的流。这是一个相对较新的功能,在 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 很旧,已经有好几年没有得到支持了。

关于c++ - FORTRAN 到 C++ 和 C++ 到 FORTRAN 的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825638/

相关文章:

java - 为什么这个float操作在C++和Java中给出不同的结果?

c - 就套接字 API 而言,主动关闭与被动关闭?

c++ - VC++ 目录似乎无法在 Visual Studio Community 2013 中设置

c++ - 从构造函数调用虚函数和纯虚函数

C# 流式套接字,如何分离消息?

linux - 使用 -lnag 链接到 NAG 库

c - Fortran:在英特尔 Fortran x64 中使用 C 函数

oop - 现代 Fortran 中的面向对象编程,包括函数指针的成员

java - jni::ExceptionDescribe 是否隐式清除了 JNI 环境对象的异常跟踪?

java - 获取主机IP地址