1

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

任何帮助表示赞赏!

!==== 编辑 ====

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

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
4

1 回答 1

5

main你的声明 inreal::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以包含 function 的源代码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

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

于 2012-08-29T09:44:58.830 回答