簡體   English   中英

從FORTRAN到C ++和從C ++到FORTRAN的通信

[英]FORTRAN to C++ and C++ to FORTRAN Communication

我有一個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很舊,已經有很多年沒有被支持了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM