2013-08-05 36 views
1

在我的fortran代碼中,我試圖包含一個DO循環,但最後我得到了「DO循環或BLOCK IF未關閉」。如果在INCLUDE語句之後的任何其他DO循環打開,它會將它們視爲嵌套循環,這表明包含的開放DO行被正確解釋,但不是END DO語句。我已經將包含的代碼簡化爲簡單的代碼,以確保它是循環,而不是循環中的語句給出問題。控制變量在DO循環之前聲明。在包含文件中使用Do-Loop

DO A = 1,3 
END DO 

Fortran77不允許INCLUDE文件中的DO循環?

我使用gfortran編譯器,如果它變化很大。

編輯:語法

EDIT2: 我使用GCC 4.6.2。現在要注意的是,如果這有所作爲,gfortran將從PSCAD生成的makefile運行。我可以提供有關該信息是否恰當的信息。

下面是遇到此問題的代碼:

TEST.F:

SUBROUTINE TESTFX() 
INTEGER A 
INCLUDE '../HDR.INC' 
END 

HDR.INC:

DO A = 1,3 
END DO 

EDIT3:在代碼編輯拼寫錯誤,並從子程序返回刪除。

+0

我猜那些流浪引號結束和結束後做是無意的。包含實際上是在自己的路線上?我會做一個清理編輯,但也許東西是你的問題。 – agentp

+0

什麼是您獲得的錯誤消息的完整和準確的文本?像喬治一樣,我認爲格式和引號不在您的原始來源中。 –

+0

「TEST.f的第6行出錯:DO循環或BLOCK IF未關閉」是錯誤。另外,我做了一個假設PSCAD一直使用gfortran,這是不正確的。 PSCAD實際上是使用f2c編譯的,我不確定f2c是否使用g77,它與makefile所調用的f2c位於同一目錄中。這最終成爲編譯語句:「f2c.exe -r8 -w -Nn5000 -NL400 -Nx400 -I」C:\ PROGRA〜1 \ PSCAD42 \ emtdc \ gnu \ inc「-I」C:\ PROGRA〜1 \ PSCAD42 \ emtdc \ gnu \ windows「-g TEST.f」。 –

回答

1

Fortran 77根本沒有INCLUDE。首先在Fortran 90中以Fortran標準出現。這就是說,INCLUDE在幾乎所有的Fortran 77編譯器中都可以作爲擴展使用,並且行爲也是一樣的 - 它與在源文件中插入包含文件基本相同INCLUDE出現在那裏。雖然我已經看到編譯器與包含跨越包含文件邊界的塊結構相關的問題發生爭執,但對此可以有什麼限制。

也許如果您同時包含源文件和包含文件文本,並且告訴我們您正在使用哪個版本的gfortran,則可以提供更明確的響應。

+0

我正在使用GCC 4.6.2。現在要注意的是,如果這有所作爲,gfortran將從PSCAD生成的makefile運行。我可以提供有關該信息是否恰當的信息。 下面是遇到此問題的代碼: TEST.F: '子程序TESTFX() 整數 包括' ../HDR.INC ' RETURN END' HDR.INC: '呢A = 1,3 END DO' –

+0

對不起,試圖添加代碼到評論回覆。我用一些示例代碼更新了我的問題。 –

0

你的INCLUDE必須放在一個新行上,它不是聲明A的聲明的一部分。爲什麼你在END中有撇號?他們不能在那裏。 END之前的RETURN語句也是完全多餘的。嘗試:

TEST.F:

SUBROUTINE TESTFX() 

INTEGER A 

INCLUDE '../HDR.INC' 

END SUBROUTINE 

HDR.INC:

DO A = 1,3 
END DO 
+0

對不起,撇號和換行符。修復了帖子。是複製粘貼的產品。您提供的代碼與我爲它保存的return語句和end子例程語句完全一樣。我試圖運行刪除return語句並將「END」更改爲「END SUBROUTINE」,但仍然存在相同的問題,並且編譯器報告了「END SUBROUTINE」行的語法錯誤。 –