2010-11-30 118 views
3

我有一個Fortran 77應用程序使用Common聲明來「共享」內存變量。回到當天,當內存昂貴且難以實現的時候,這是它的方式。Fortran 77轉換爲C++

被控設備設置狀態標誌。這些標誌位於這些通用變量中。

關於如何在C++中實現通用功能的任何建議?

一個類也許是所有常見變量都是公共的。因此任何實例化這個類的程序都可以訪問Common變量的內容。

是否有將Fortran轉換爲C或C++的教程/指南?

感謝

+3

25年前關於如何將Fortran轉換爲C的問題,comp.lang.c上的標準答案是「rm -rf * .f會將所有的fortran程序轉換爲可用磁盤塊,然後您可以使用它「 – 2010-11-30 00:12:45

+1

wrt」受控設備設置狀態標誌,這些標誌位於這些通用變量中「,您是否需要全局變量,或者是否需要C++代碼與實際的Fortran樣式通用塊互操作?後者可能取決於你的編譯器/鏈接器。 – 2010-11-30 00:38:59

+0

常見的變化不真的節省太多的內存!當你談論「設備控制」時,我猜想這些變量是常見的,因爲設備驅動程序需要將其控制標誌映射到固定內存區域。 C extern在功能上是等價的,但是,由於鏈接器根據實際字段名稱映射內存,所以要小心,因此如果要混合C和Legacy Fortran模塊,則需要確保按相同順序定義相同的名稱! – 2010-11-30 01:26:10

回答

2

首先,您可以用Fortran 90個的模塊擺脫公共塊。

如果你想直接將通用塊轉換爲C++,你必須創建一大堆全局/靜態變量或使用未命名的名稱空間。

但是,這違反了信息隱藏,大多數人會建議您不要盲目使用全局變量。

更一般地,您可能有興趣查閱Barton-Nackman書籍Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples。這有點過時,但這不應該太重要。它假設您擁有Fortran /過程背景,將C++用於科學或工程應用。

1

對我對Alexandros'回答「自然」音譯的評論的恰當意見是將所有內容都包含在common塊中作爲C++代碼中的類靜態。結果將不是是很好的C++代碼,但它會給出一個地方開始重構。也就是說,我通常會嘗試將C++前端與現有的Fortran後端接口連接起來,然後然後開始翻譯過程,如果它仍然是一個好主意。

2

This Fortran to C/C++ Tutorial提示:

 FORTRAN: 
      DOUBLE PRECISION X 
      INTEGER A, B, C 
      COMMON/ABC/ X, A, B, C 

     C: 
      extern struct{ 
       double x; 
       int a, b, c; 
      } abc_; 

     C++: 
     extern "C" { 
      extern struct{ 
       double x; 
       int a, b, c; 
      } abc_; 
     } 

你把EXTERN結構爲.h文件中,其中C/C++的文件是指與的#include,以及在只有一個.c和.cpp文件你把什麼在.h文件中,但沒有「extern」字樣。

我的假設是,你必須從頭開始是相對簡潔和邊界不可理解的,並且你想把它翻譯成C++,保持與原始的一對一的對應關係。

0

不要這樣做,常見的塊在現代是一種詛咒。

1

我知道我正在評論我在評論中所說的話,但是,我不認爲有人知道了。

短語「正在控制的設備」告訴我,該程序是某種設備驅動程序,並且很可能該設備期望其標誌位於特定的內存區域。使用普通存儲的原因是各個模塊可以直接訪問和更新這些區域。將這些轉換成C extern should工作,但你真的需要弄清楚設備接口的文檔,以確保你正確地做到了這一點。

失去一些海報建議的常見行爲根本無法在這種情況下發揮作用。如果您有足夠的時間和信心,最好的辦法是創建一個靜態類,它處理公共存儲的所有更新,並用「get」和「set」將所有讀寫替換爲新類。

0

奇怪,因爲它可能看起來,這可能是一個地方應該使用c位像字段。

他有一塊硬件,它可能有各種控制寄存器和狀態標誌,映射到一些固定的內存地址。

具有正確佈局的位域(編譯器特定)的結構, 與指向正確地址的該類型的指針可能會有所訣竅。

由於字段值可能會在沒有通知的情況下發生變化,因此可能需要非暴力限定符。

如果提問者會提供關於公共塊的佈局的更多信息,以及對其中的數據的解釋,將會有所幫助。