2010-06-14 64 views
0

我是Fortran的新手,只是做了一些簡單的工作。作爲一名普通的新程序員,不確定這是如何工作的,所以如果我的解釋或符號不是最好的,請原諒。 .F文件的頂部有常用的聲明。向我解釋的人說,把它想成C語言中的一個結構體,而且它們是全球性的。也在同一個.F文件中,他們用什麼類型聲明它。因此,它是這樣的:Fortran中的常見塊用法

COMMON SOMEVAR 

INTEGER*2 SOMEVAR 

,然後當我真正看到它在其他一些文件正在使用,他們聲明局部變量(例如SOMEVAR_LOCAL),並根據病情的不同,他們成立SOMEVAR_LOCAL = 1或0

然後是另一個條件後下樓會對你說行類似

IF (SOMEVAR_LOCAL. eq. 1) 
SOMEVAR(PARAM) = 1; 

(我再次道歉,如果這是不正確的Fortran,但我沒有訪問代碼現在)。所以在我看來,有一個叫做SOMEVAR的「結構體」,它有一定的長度(2個字節的數據?),然後有一個局部變量用作一個標誌,以便在後面的行中全局變量struct SOMEVAR可以設置爲該值。但是因爲有(PARAM),它就像那個特定實例的數組?謝謝。對不起,我的不好解釋,但希望你會明白我在問什麼。

回答

1

第一個聲明將SOMEVAR作爲兩個字節的標量整數。您顯示的用法是SOMEVAR有一個數組 - 基於它被索引。這可以通過「序列關聯」在Fortran中完成,但這是一種不好的做法。在一個文件中,您可以將SOMEVAR聲明爲INTEGER * 2,並將兩個字節分配給此標量。在另一個文件中,你可以聲明它爲INTEGER * 1 SOMEVAR(2),並且保留兩個字節,這次是一個由兩個元素組成的數組,每個元素都是一個字節。在這兩個文件中使用相同的公共塊可能會導致這兩個變量重疊,逐字節序列關聯。很多年前,當內存很小時,程序員通過這樣做來減少內存使用量,知道不同的子例程在不同的時間使用變量。今天做這件事的原因非常非常有限。大多數人不應該因爲它容易混淆。

您也可以使用EQUIVALENCE語句設置序列關聯。再次,最好避免。對於那些需要EQUIVALENCE語句的「棘手」事情來說,現代替代物是TRANSFER函數。

2

只是爲了放大已經提到的東西@MSB:COMMON塊告訴編譯器如何在內存中放置變量。幾乎沒有理由將它們與現代Fortran一起使用,即使用任何可以應對Fortran 90或更高版本的編譯器,並且有充分理由避免它們。

並且增加一件事:在現代Fortran中,您可以大致做C結構對用戶定義類型所做的事情。檢查您的文件的類型。

+0

我完全同意。對於全局變量,對於新的Fortran程序,最好使用模塊變量而不是通用塊。某些變量不能放置在公共塊中,並且序列關聯是陳舊的。 TYPE是一種比普通更好的組織變量的方法,並且更接近於C結構。 – 2010-06-15 07:34:15