我是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
答案 0 :(得分:5)
main
中real::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
我赞成第一种方法,当你的程序和项目变得更大并且模块化的好处开始成为必需品而不是很好的时候它会更好地扩展,但是当你学习时,第二种方法对于小程序是可行的语言。