我有一個Fortran 77應用程序使用Common聲明來「共享」內存變量。回到當天,當內存昂貴且難以實現的時候,這是它的方式。Fortran 77轉換爲C++
被控設備設置狀態標誌。這些標誌位於這些通用變量中。
關於如何在C++中實現通用功能的任何建議?
一個類也許是所有常見變量都是公共的。因此任何實例化這個類的程序都可以訪問Common變量的內容。
是否有將Fortran轉換爲C或C++的教程/指南?
感謝
我有一個Fortran 77應用程序使用Common聲明來「共享」內存變量。回到當天,當內存昂貴且難以實現的時候,這是它的方式。Fortran 77轉換爲C++
被控設備設置狀態標誌。這些標誌位於這些通用變量中。
關於如何在C++中實現通用功能的任何建議?
一個類也許是所有常見變量都是公共的。因此任何實例化這個類的程序都可以訪問Common變量的內容。
是否有將Fortran轉換爲C或C++的教程/指南?
感謝
首先,您可以用Fortran 90個的模塊擺脫公共塊。
如果你想直接將通用塊轉換爲C++,你必須創建一大堆全局/靜態變量或使用未命名的名稱空間。
但是,這違反了信息隱藏,大多數人會建議您不要盲目使用全局變量。
更一般地,您可能有興趣查閱Barton-Nackman書籍Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples。這有點過時,但這不應該太重要。它假設您擁有Fortran /過程背景,將C++用於科學或工程應用。
對我對Alexandros'回答「自然」音譯的評論的恰當意見是將所有內容都包含在common
塊中作爲C++代碼中的類靜態。結果將不是是很好的C++代碼,但它會給出一個地方開始重構。也就是說,我通常會嘗試將C++前端與現有的Fortran後端接口連接起來,然後然後開始翻譯過程,如果它仍然是一個好主意。
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++,保持與原始的一對一的對應關係。
不要這樣做,常見的塊在現代是一種詛咒。
我知道我正在評論我在評論中所說的話,但是,我不認爲有人知道了。
短語「正在控制的設備」告訴我,該程序是某種設備驅動程序,並且很可能該設備期望其標誌位於特定的內存區域。使用普通存儲的原因是各個模塊可以直接訪問和更新這些區域。將這些轉換成C extern should
工作,但你真的需要弄清楚設備接口的文檔,以確保你正確地做到了這一點。
失去一些海報建議的常見行爲根本無法在這種情況下發揮作用。如果您有足夠的時間和信心,最好的辦法是創建一個靜態類,它處理公共存儲的所有更新,並用「get」和「set」將所有讀寫替換爲新類。
奇怪,因爲它可能看起來,這可能是一個地方應該使用c位像字段。
他有一塊硬件,它可能有各種控制寄存器和狀態標誌,映射到一些固定的內存地址。
具有正確佈局的位域(編譯器特定)的結構, 與指向正確地址的該類型的指針可能會有所訣竅。
由於字段值可能會在沒有通知的情況下發生變化,因此可能需要非暴力限定符。
如果提問者會提供關於公共塊的佈局的更多信息,以及對其中的數據的解釋,將會有所幫助。
25年前關於如何將Fortran轉換爲C的問題,comp.lang.c上的標準答案是「rm -rf * .f會將所有的fortran程序轉換爲可用磁盤塊,然後您可以使用它「 – 2010-11-30 00:12:45
wrt」受控設備設置狀態標誌,這些標誌位於這些通用變量中「,您是否需要全局變量,或者是否需要C++代碼與實際的Fortran樣式通用塊互操作?後者可能取決於你的編譯器/鏈接器。 – 2010-11-30 00:38:59
常見的變化不真的節省太多的內存!當你談論「設備控制」時,我猜想這些變量是常見的,因爲設備驅動程序需要將其控制標誌映射到固定內存區域。 C extern在功能上是等價的,但是,由於鏈接器根據實際字段名稱映射內存,所以要小心,因此如果要混合C和Legacy Fortran模塊,則需要確保按相同順序定義相同的名稱! – 2010-11-30 01:26:10