2015-07-03 22 views
1

在構建我的代碼時,我收到幾個語句函數的「未定義的引用錯誤...」錯誤。它編譯成功。構建幾個語句函數的代碼時出現未定義的引用錯誤

我的程序代碼部分在定義了必要的參數和尺寸後,從下面的語句函數開始。另外,模塊的CONTAINS部分還有其他功能/子程序。

 PROGRAM ...... 
     DIMENSIONS bla bla 

     !***** FUNCTIONS ***** 
     !***FREE ENERGIES PER VOLUME OF INDIVIDUAL PHASES 

     FL(X)=((1.-X)*GCU_L+R*T*((1.-X)*DLOG(1.-X))) 
     DFI(X)=2.*CC*(X-0.435)/VM 

     ***************************** 
     VM=20.65D-6 
     R=8.3145  
     T=250. + 273. 
     TEMP=T 
     GCU_L=5194.277+120.973331*T 

     bla bla 

     END PROGRAM 

構建的錯誤,我收到:

gfortran -Wall -o "123456" "123456.f90" (in directory: /Geany) 
    /tmp/ccwapaHQ.o: In function `__mymodule_MOD_fsteady': 
    123456.f90:(.text+0x7e3a): undefined reference to `fl_' 
    123456.f90:(.text+0x7ea9): undefined reference to `dfi_' 
    **DELETED THE REST** 
    collect2: error: ld returned 1 exit status 
    Compilation failed. 

我想複製聲明功能,包含我模塊的部分可能會解決錯誤。然而,它產生以下編譯錯誤...

 gfortran -Wall -c "123456.f90" (in directory: /Geany) 
     Compilation failed. 
     123456.f90:523.127: 
     FL(X)=((1.-X)*GCU_L+R*T*((1.-X)*DLOG(1.-X))) 
              1 

     DFI(X)=2.*CC*(X-0.435)/VM 
           1 
     Error: Unexpected STATEMENT FUNCTION statement in CONTAINS section at (1) 
     123456.f90:1332.16: 
     USE myModule 
      1 
     Fatal Error: Can't open module file 'mymodule.mod' for reading at (1): No such file or directory 
+0

我想,在第一種情況下,你在'mymodule'模塊的'fsteady'過程中引用了'fl'。你能證實,證明嗎? – francescalus

+0

是的。你是對的。那我該怎麼辦? – Vahid

回答

1

首先要說的是,聲明功能在當前的Fortran是過時的,而且我建議你考慮避免使用它們。

但是,您的第一個子問題並不是真的專用於語句函數,而是範圍。你的函數是在主程序中聲明/定義的:你不能指望它們在一個與該程序關聯的模塊中可用,而不會超出你期望的變量。使用關聯則以另一種方式進行,使主程序中的模塊中的實體可用(或使用模塊的其他事物)。

語句函數與內部過程有所不同,因爲它們不能成爲模塊中過程引用的實際參數。您可以將主程序中的「正確」函數傳遞給模塊過程,而不是語句函數。

您試圖將語句函數移入模塊本身是第二個子問題。您不能在模塊中定義語句功能。它不能在contains聲明之前,並且它不能在之後(在標準中它們每個都被限制所覆蓋)。

通過在主程序中將您的語句功能更改爲模塊的全部功能(在contains之後),很難發現您會失去任何東西。

+0

嗯,一個模塊中可以有一個聲明函數,但只能在一個包含的過程中。不是「裸體」。 – francescalus

+0

謝謝。你回答了我腦海中的許多問題。我理解你的所有段落,除了第三個。此外,我意識到有時候人們會在模塊外部的任何地方使用** CONTAIN **,我不知道這意味着什麼...... – Vahid

+0

'contains'介紹了其他地方的程序_,它可以通過(以F2008的方式)。你可以從最近看到一個關於這個問題的問題。 – francescalus

相關問題