首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FORTRAN到C++,C++到FORTRAN通信

FORTRAN到C++,C++到FORTRAN通信
EN

Stack Overflow用户
提问于 2014-05-23 09:31:08
回答 1查看 422关注 0票数 2

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

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2015-02-12 17:49:58

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

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

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

代码语言:javascript
复制
  OPEN(20,file="myfifo",access="stream",form="unformatted",status="old",action="write")

并使用如下语句来写

代码语言:javascript
复制
    WRITE (20) A

为什么没有格式化的流?

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

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

运行时系统如何知道它要写多长时间的记录?所以,一个常见的实现是编写一个虚拟记录标记,编写记录(并了解它的长度),编写尾随标记,寻找第一个标记,覆盖虚拟记录标记,然后继续。这不适用于命名管道--您不能在那里寻找。如果您仍然在缓冲区中,则可能是幸运的,但您不能依赖它。

关于编译器:如果与旧g77代码的兼容性是一个问题,请使用gfortran。它支持ACCESS="STREAM",并拥有来自g77的大部分扩展。g77已经很老了,已经有几年没有被支持了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23825638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档