2012-08-29 151 views
1

我是Fortran編程的新手。我有兩個.f90文件。Fortran 90,函數,數組

fmat.f90

function fmat(t,y) 
implicit none 
real::t 
real::y(2) 
real::fmat(2) 
fmat(1) = -2*t+y(1) 
fmat(2) = y(1)-y(2) 
end function fmat 

而且,main.f90時的樣子:

program main 
implicit none 
real::t 
real::y(2) 
real::fmat(2) 
real::k(2) 
t=0.1 
y(1)=0.5 
y(2)=1.4 
k=fmat(t,y) 
write(*,*) k 
end program main 

所以,我期待0.3 -0.9。但我不斷收到以下錯誤消息:

ifort fmat.f90 main.f90 

main.f90(13): error #6351: The number of subscripts is incorrect. [FMAT] 
k=fmat(t,y) 
--^ 
compilation aborted for main.f90 (code 1) 

任何幫助表示讚賞!

!==== ====編輯

我感謝馬克對他的答案。我實際上可以使用「子程序」方法編譯單獨的文件而不出現任何錯誤。

main.f90時

program main 
    implicit none 
    real::t 
    real::y(2) 
    real::k(2) 
    t=0.1 
    y(1)=0.5 
    y(2)=1.4 
    call fmat_sub(t,y,k) 
    write(*,*) k 
end program main 

fmat_sub.f90

subroutine fmat_sub(t,y,k) 
    implicit none 
    real::t 
    real::y(2),k(2) 
    k(1) = -2*t+y(1) 
    k(2) = y(1)-y(2) 
end subroutine fmat_sub 
+0

現在嘗試在'main'中用'call fmat_sub(t,y)'行調用fmat_sub(t,y,k)'行,看看結果如何。 –

回答

5

你的聲明,在main,的real::fmat(2)告訴編譯器fmat是實數的與陣列秩1和長度2.並沒有告訴任何有關在其他文件中寫入的函數fmat的任何信息。

避免此類問題的一個好方法是使用現代Fortran的功能。把你的子程序和函數放入模塊使用關聯他們。因此,改變fmat.f90爲類似

module useful_functions 

contains 
function fmat(t,y) 
implicit none 
real::t 
real::y(2) 
real::fmat(2) 
fmat(1) = -2*t+y(1) 
fmat(2) = y(1)-y(2) 
end function fmat 

end module useful_functions 

和修改main.f90喜歡的東西

program main 
use useful_functions 
implicit none 
real::t 
real::y(2) 
real::k(2) 
t=0.1 
y(1)=0.5 
y(2)=1.4 
k=fmat(t,y) 
write(*,*) k 
end program main 

這種方法可以讓編譯器生成明確的接口的模塊功能,並允許它來檢查,在編譯時,虛擬參數實際參數之間的匹配。

既然你是新手,我已經把一些關鍵術語用斜體表示出來,在你的編譯器手冊或其他最喜歡的Fortran文檔中閱讀它們。

另一種方法來解決你的問題將是編輯main.f90到包括功能fmat源,如:

program main 
implicit none 
real::t 
real::y(2) 
real::k(2) 
t=0.1 
y(1)=0.5 
y(2)=1.4 
k=fmat(t,y) 
write(*,*) k 

contains 

function fmat(t,y) 
implicit none 
real::t 
real::y(2) 
real::fmat(2) 
fmat(1) = -2*t+y(1) 
fmat(2) = y(1)-y(2) 
end function fmat 
end program main 

我贊成第一種方法,它擴展好得多當你的計劃和項目得到大模塊化的好處開始成爲必需品,而不是好的,但第二種方法適用於小型課程,而您正在學習語言。

+0

非常感謝您的回答。 –

+0

我喜歡將fortran 90(〜20年前)中介紹的功能稱爲「* modern *」:)。好的回答(+1) – mgilson