Fortran 90,功能,阵列

时间:2012-08-29 09:22:14

标签: function fortran

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

而且,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)

感谢任何帮助!

!====编辑====

我感谢Mark的回答。我实际上可以使用"子程序"编译单独的文件而不会出现任何错误。方法

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

1 个答案:

答案 0 :(得分:5)

mainreal::fmat(2)的声明告诉编译器fmat是一个秩为1且长度为2的实数数组。它没有告诉它有关函数的任何信息{ {1}}写在您的其他文件中。

避免此类问题的一个好方法是使用现代Fortran的功能。将子例程和函数放入 modules use-associate 中。因此,将fmat更改为

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

这种方法允许编译器为模块函数生成显式接口,并允许它在编译时检查伪参数实际参数之间的匹配

由于您是新手,我将一些关键术语用斜体字表示,在您的编译器手册或其他最喜欢的Fortran文档中阅读它们。

解决问题的另一种方法是编辑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 以包含函数main.f90的来源,如下所示:

fmat

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