2014-11-02 63 views
0

我找不出什麼我的錯誤,我用Google搜索這個問題採取了「隱無」,並宣佈eyery變量整數我用,但我仍然得到follwing錯誤:FORTRAN型missmatch調用函數

main.f95:37.20: 

    e = Collatzf(i) 
       1 
Error: Return type mismatch of function 'collatzf' at (1) (UNKNOWN/INTEGER(4)) 
main.f95:37.12: 

    e = Collatzf(i) 
     1 
Error: Function 'collatzf' at (1) has no IMPLICIT type 

這裏是我的代碼:

INTEGER FUNCTION Collatzf(n) 

    IMPLICIT NONE 
    INTEGER :: n, z 

    z = 0 

    DO WHILE(n /= 1) 

     IF (MOD(n, 2) == 0) THEN 
      n = n/2 
     ELSE 
      n = 3 * n + 1 
     END IF 

     z = z + 1 

    END DO 

    Collatzf = z 

END FUNCTION Collatzf 


PROGRAM ProjectEuler14 

    IMPLICIT NONE 
    INTEGER :: lsg, e, s, i 

    lsg = 0 
    e = 0 
    s = 0 
    i = 2 

    DO WHILE(i <= 1000000) 

     e = Collatzf(i) 

     IF(e > lsg) THEN 
      lsg = e 
      s = i 
     END IF 

     i = i + 1 

    END DO 

    WRITE(*, *) s, i 

END PROGRAM ProjectEuler14 

THX :)

回答

0

lanH的回答是正確的。三個建議的解決方案是:

1)「提供Collat​​zf的主程序內的類型的聲明」,這意味着添加

INTEGER :: Collatzf 

語句在PROGRAM ProjectEuler14變量聲明。

2),這意味着裝置添加

INTERFACE 
    FUNCTION Collatzf (i) 
    INTEGER :: Collatzf 
    INTEGER, INTENT(IN) :: i 
    END FUNCTION Collatzf 
END INTERFACE 

語句來在 「PROGRAM ProjectEuler14」 變量聲明 「爲Collat​​zf功能提供接口機構」。

3)「作出這樣的功能的模塊程序,然後使用主程序內的模塊」,這意味着創建一個新文件,命名爲(爲簡單起見)「functions.f90」:

MODULE functions 

CONTAINS 

    INTEGER FUNCTION Collatzf(n) 

    IMPLICIT NONE 
    INTEGER :: n, z 

    z = 0 

    DO WHILE(n /= 1) 

     IF (MOD(n, 2) == 0) THEN 
      n = n/2 
     ELSE 
      n = 3 * n + 1 
     END IF 

     z = z + 1 

    END DO 

    Collatzf = z 

    END FUNCTION Collatzf 

END MODULE functions 

然後,例如通過先編譯functions.f90:

gfortran -c functions.f90 

和編撰的 「功能」 模塊鏈接到你的主程序:

gfortran main.f90 functions.o 
+0

謝謝你非常有幫助 – Anzzi 2014-11-03 13:41:14

1

沒有聲明主程序裏面Collatzf功能。

Fortran中的程序單元有一個單獨的編譯模型 - 編譯程序單元時,編譯器技術上對其他程序單元一無所知,除非有聲明明確說明其他單元。因此,編譯主程序時(從PROGRAM語句到END PROGRAM語句)編譯器不知道Collatzf是什麼,即使該外部函數的定義緊接在主程序之前。它不能應用隱式打字規則,因爲你指定了IMPLICIT NONE(一件好事),因此你會看到第二個錯誤。

在主程序中提供Collat​​zf類型的聲明。比這更好 - 在主程序中爲該功能提供接口主體。甚至比再次更好 - 使該功能成爲模塊過程,然後在主程序中使用該模塊。