Fortran 90,功能,阵列

Bil*_* TP 1 fortran function

我是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)

Hig*_*ark 5

你的宣言,在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)

我赞成第一种方法,当你的程序和项目变得越来越大时它会更好地扩展,并且模块化的好处开始成为必需品而不是好的,但是第二种方法对于小型程序在你学习语言时是可行的.