我是Fortran编程的新手.我有两个.f90文件.
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
Run Code Online (Sandbox Code Playgroud)
并且,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
Run Code Online (Sandbox Code Playgroud)
所以,我期待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)
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!
!====编辑====
我感谢马克的答案.我实际上可以使用"子程序"方法编译单独的文件而没有任何错误.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
你的宣言,在main中,real::fmat(2)告诉编译器fmat是秩为1和长度2 REAL数组它不告诉它的功能,任何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
Run Code Online (Sandbox Code Playgroud)
并修改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
Run Code Online (Sandbox Code Playgroud)
这种方法允许编译器为模块函数生成显式接口,并允许它在编译时检查伪参数和实际参数之间的匹配.
由于您是一名新手,我将一些关键术语用斜体字表示,在您的编译器手册或其他最喜欢的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
Run Code Online (Sandbox Code Playgroud)
我赞成第一种方法,当你的程序和项目变得越来越大时它会更好地扩展,并且模块化的好处开始成为必需品而不是好的,但是第二种方法对于小型程序在你学习语言时是可行的.