2011-07-20 43 views
1

我試圖編譯一些遺留代碼,並且我的可用編譯器窒息。下面是線引起的問題:什麼是Fortran編譯器支持這些功能?

線5:

DIMENSION MMO(12)/31,28,31,30,31,30,31,31,30,31,30,31/

線7,8:

DEFINE FILE 4(ANSI,FB,140,3360,0) 
DEFINE FILE 7(SDF, ,42,42)

線119:

1905 FORMAT(J2,J4,J2,29I5)

雷希-富士通95表示:

1116-S: "fz32.f", line 5, column 24: Comma expected. 
1110-S: "fz32.f", line 5, column 28: Missing name. 
1336-S: "fz32.f", line 7, column 7: DEFINE FILE statement not supported. 
1336-S: "fz32.f", line 8, column 7: DEFINE FILE statement not supported. 
1511-S: "fz32.f", line 119: Invalid character string 'J' found in format specification. 
1515-S: "fz32.f", line 119: Edit descriptor must be specified after the repeat specification in a format specification.

...更缺少名稱錯誤

gfortran 77說:

fz32.f:5: 
     DIMENSION MMO(12)/31,28,31,30,31,30,31,31,30,31,30,31/ 
         ^
Invalid form for DIMENSION statement at (^) 
fz32.f:7: 
     DEFINE FILE 4(ANSI,FB,140,3360,0) 
     1      2 
Unrecognized statement name at (1) and invalid form for assignment or statement-function definition at (2) 
fz32.f:8: 
     DEFINE FILE 7(SDF, ,42,42) 
     1     2 
Unrecognized statement name at (1) and invalid form for assignment or statement-function definition at (2) 
fz32.f:119: 
    1905 FORMAT(J2,J4,J2,29I5) 
       ^
Unrecognized FORMAT specifier at (^) 
fz32.f:119: 
    1905 FORMAT(J2,J4,J2,29I5) 
       ^
Unrecognized FORMAT specifier at (^) 
fz32.f:119: 
    1905 FORMAT(J2,J4,J2,29I5) 
        ^
Unrecognized FORMAT specifier at (^)

海合會失敗,類似的錯誤。

那麼有人知道什麼編譯器可以用來建立這個代碼?

另外,在第7行和第8行,ANSI和SDF在代碼中沒有定義。這些線路如何工作?我期望他們正在格式化標誌,但我沒有看到任何地方記錄。

回答

1

這一個:

DIMENSION MMO(12)/31,28,31,30,31,30,31,31,30,31,30,31/

僅僅是一個非標準版本數據語句。在F77你可以做

DIMENSION MMO(12) 
    DATA MMO /31,28,31,30,31,30,31,31,30,31,30,31/ 

或現代FORTRAN,你可以做

integer, dimension(12) :: mmo = [31,28,31,30,31,30,31,31,30,31,30,31 ] 

define東西多了幾分晦澀(可能識別編譯器作爲DEC的編譯器或相關 - OOF,那是舊的)。它看起來像你會想

DEFINE FILE 4(ANSI,FB,140,3360,0) 
DEFINE FILE 7(SDF, ,42,42) 

轉換成類似

OPEN(unit=4, access='direct', reclen=FB) 
OPEN(unit=7, access='direct') 

,並看到如何繼續下去。

我找不到任何地方的J說明符(並且搜索J的用法與您想象的一樣有用)。所以也許我錯了DEC。你能舉一個例子說明如何使用1905格式嗎?

+0

20世紀80年代,DEC FORTRAN和20世紀70年代的KRONOS和NOS(來自CDC)以及這個時代的其他幾個人(GCOS和幾個第三方RSX實現)都非常瞭解。我所使用的代碼在文件記錄管理功能中都不是很重要。 OP代碼看起來很陌生,即使在我古老的背景下。我唯一沒有使用的主要FORTRAN是IBM恐龍,因此我的答案是我的懷疑。 – wallyk

+0

DEC看起來與我目前看到的最接近,但我仍然找不到對'j'作爲格式的任何引用。它正在寫入int數據,有人猜測它是'i.2'或類似的簡寫。沒有那麼多的代碼,所以用這裏的指針重寫很容易。多謝你們。 –

2

我認爲這些都是非標準的Fortran。當供應商試圖通過提供方便的擴展來競爭時,這在FORTRAN 77中很常見。這也是一個鎖定陷阱,但人們對那個時候不那麼敏感。我認爲,通過推斷這些東西應該做什麼,你最好將你的代碼翻譯成符合標準的代碼。這取決於你有多少行會有多困難。有一些代碼轉換產品(例如,SPAG,http://www.polyhedron.com/spagqa0html) - 我不知道他們是否會理解這些擴展。

3

DEFINE FILE很可能來自IBM OS/360的FORTRAN編譯器,並且與操作系統JCL有關。可能還有其他的實現,但是現代操作系統上沒有必要(也沒有多少實用性)來指定將來的記錄數和記錄文件的大小。詳情請參閱this

初始化尺寸(非標準語言擴展)可以改爲data聲明:

DIMENSION MMO(12) 
DATA MMO/31,28,31,30,31,30,31,31,30,31,30,31/ 

我依稀記得以前整個J格式代碼來了,但不記得這是什麼意思。鑑於情況下,你可以將其更改爲I,看看是否正常:

1905 FORMAT(I2,I4,I2,29I5) 
+0

哇,用於調用JCL和OS/360的+1。 –