2012-06-27 46 views
3

我需要編譯以前使用Compaq Fortran編譯器的舊Fortran程序。我似乎無法弄清楚以'#'開頭的常量是什麼。 gfortran說它的語法錯誤,我似乎無法找到很多答案。在Fortran中,以'#'開頭和/或以'c'結尾的常量是什麼意思?

CHAR2 = IATA(KK) - #20202030 
CHAR3 = IATA(KK+1) - #20202030 

什麼樣的常數是#20202030?根據註釋,此代碼應在IATA中採用兩個ASCII字符並將它們轉換爲二進制。有人可以解釋這個嗎?

再往下:

IF (IATA(KK+1) .EQ. #2020202C) THEN 

現在有一個 'C' 在末端。那是什麼意思?

我怎樣才能把這個過渡到gfortran?這感覺就像我失去了一些明顯的東西。請賜教。

謝謝!

+0

通常以#開頭的東西都是十六進制代碼,但仍然對fortran一無所知我無法確定任何事情。 – t3hn00b

+0

我在想那樣的事情,但是從我發現的Fortran十六進制常量開始爲'Z'。我應該說,我對Fortran一無所知。只有我在最後一天試圖編譯這個的過程中學到了什麼。 –

回答

9

你在看什麼是非標準的Fortran。在Compaq Fortran中,#用於爲十六進制常量加上前綴,如其中一條註釋所示。如另一條評論所示,十六進制常量的標準前綴是Z,數字應該用''標記。所以非標準#2020202C應翻譯成標準Z'2020202C'

至於尾隨C,我認爲這只是一個十六進制數字。

+0

你先生,剛剛過完我的一天。老開發人員已經走了很久,而且令人驚訝的是我無法谷歌回答這個問題。 –

4

只是評論:

除了在非標符號是十六進制的文字,這些也都是ASCII字符串安裝到32位的整數值。當存儲在存儲器#20202030中時爲'___0''0___',具體取決於體系結構的端子,而#2020202C'___,'',___'(下劃線表示空白)。帶空格的填充是標準的Fortran行爲,並將8位字符存儲爲32位類型,而不是NUL-s填充空白。使用#20202030而不是#00000030,對Fortran程序員應該不會感到意外。

在C和C++從其他角色減去'0'是將字符轉換像012等方面其對應的數字(即完全失敗特殊的Unicode符號工作)很常見的方式。例如。 '9' - '0'給出9,因爲9的ASCII碼是0x39(57),而0的ASCII碼是0x30(48)。 Fortran不會像C和C++那樣將CHARACTER視爲整數,而且必須使用ICHAR()IACHAR()將它們轉換爲它們的ASCII碼,但這些代碼仍然像C/C++那樣工作。

如何定義IATA數組?值如何分配給它的元素?

+0

感謝您的帖子,我希望我可以選擇兩個答案。我第一次發現國際航空運輸協會處於一個共同的區塊:「COMMON/FFDTA/IATA(2800),A,B,C」。我認爲這只是意味着它是一個通用數組,但我無法找到它被分配到源文件中的任何位置。它只包含在分支語句和訪問中。默認情況下,其他源模塊是否可以使用通用塊? –

+1

其他模塊始終可見公用塊。對於支持外部符號的其他語言編寫的模塊(例如C/C++)甚至可以看到它們。如果'IATA'沒有在其他地方定義,那麼它是一個'INTEGER'的數組(除非隱式名稱到類型映射是通過'IMPLICIT'改變的)。 –

+1

另外,通用塊只命名內存的共享部分。你可以給使用它的不同子程序(甚至不同的變量類型,這是許多細微的錯誤的來源)的公共塊內存儲的變量賦予不同的名稱。這意味着你可以有一個具有'COMMON/FFDTA/ASD(2800),X,Y,Z'的子程序,而'ASD'將指向與IATA相同的存儲空間。 –

相關問題