使用子程序将程序转换为模块时出错
errors when transforming program into module with subroutine
给定一个简单的程序,它运行得很好,例如:
program test
implicit none
real, allocatable :: x(:)
real :: su, si
allocate(x(3))
x(:) = (/1,2,3/)
su=sum(x(:))
si=size(x(:))
end program
我试着用子程序把它改造成一个外部模块:
module test
implicit none
real, allocatable, intent(in) :: x(:)
real, intent(out) :: su, si
contains
subroutine sumsize(x(:),su,si)
su=sum(x(:))
si=size(x(:))
end subroutine
end module
但是我无法用几条错误消息对其进行编译,我认为其中大部分是基于 x(:)
、su
和 si
都不是 DUMMY
变量.
在哪里以及如何定义假人?看起来这是一个简单的形式错误。
另一个错误指出子程序头中的垃圾,并在使用 subroutine sumsize(x,su,si)
定义它时消失。为什么子程序的输入不能是向量?
通过 gfortran -ffree-form -c module_test.f -o test.o
使用 gfortran - gcc v. 8.3.0-6 (Debian)
编译。
伪参数,在其他编程语言中也称为函数参数,必须在函数或子例程内声明。
此外,参数列表(子例程名称后括号中的参数名称)不应包含任何额外的括号。
module test
implicit none
contains
subroutine sumsize(x,su,si)
real, intent(in) :: x(:)
real, intent(out) :: su, si
su=sum(x(:))
si=size(x(:))
end subroutine
end module
此外,您通常不希望伪参数为 allocatable
。这通常在子例程内分配或释放数组时使用,或者如果您希望允许使用未分配的数组。
program test
implicit none
real, allocatable :: main_x(:)
real :: main_su, main_si
allocate(main_x(3))
main_x(:) = (/1,2,3/)
call sumsize(main_x, main_su, main_si)
end program
我用 main_
前缀重命名了变量。不需要,只是为了区别于子程序内部的名称。
给定一个简单的程序,它运行得很好,例如:
program test
implicit none
real, allocatable :: x(:)
real :: su, si
allocate(x(3))
x(:) = (/1,2,3/)
su=sum(x(:))
si=size(x(:))
end program
我试着用子程序把它改造成一个外部模块:
module test
implicit none
real, allocatable, intent(in) :: x(:)
real, intent(out) :: su, si
contains
subroutine sumsize(x(:),su,si)
su=sum(x(:))
si=size(x(:))
end subroutine
end module
但是我无法用几条错误消息对其进行编译,我认为其中大部分是基于 x(:)
、su
和 si
都不是 DUMMY
变量.
在哪里以及如何定义假人?看起来这是一个简单的形式错误。
另一个错误指出子程序头中的垃圾,并在使用 subroutine sumsize(x,su,si)
定义它时消失。为什么子程序的输入不能是向量?
通过 gfortran -ffree-form -c module_test.f -o test.o
使用 gfortran - gcc v. 8.3.0-6 (Debian)
编译。
伪参数,在其他编程语言中也称为函数参数,必须在函数或子例程内声明。
此外,参数列表(子例程名称后括号中的参数名称)不应包含任何额外的括号。
module test
implicit none
contains
subroutine sumsize(x,su,si)
real, intent(in) :: x(:)
real, intent(out) :: su, si
su=sum(x(:))
si=size(x(:))
end subroutine
end module
此外,您通常不希望伪参数为 allocatable
。这通常在子例程内分配或释放数组时使用,或者如果您希望允许使用未分配的数组。
program test
implicit none
real, allocatable :: main_x(:)
real :: main_su, main_si
allocate(main_x(3))
main_x(:) = (/1,2,3/)
call sumsize(main_x, main_su, main_si)
end program
我用 main_
前缀重命名了变量。不需要,只是为了区别于子程序内部的名称。