gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:36 28 4
gpt4 key购买 nike

我有一个 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com