我正在编写代码来添加一个封闭源的有限元框架,这个框架迫使我(由于依赖于一些旧的F77风格方法)在一个地方依赖于假定大小的数组。
是否可以将假定大小的数组写入标准输出,无论其大小如何?
这不起作用:
module fun
implicit none
contains
subroutine writer(a)
integer, dimension(*), intent(in) :: a
write(*,*) a
end subroutine writer
end module fun
program test
use fun
implicit none
integer, dimension(2) :: a
a(1) = 1
a(2) = 2
call writer(a)
end program test
使用英特尔Fortran编译器抛出
error #6364: The upper bound shall not be omitted in the last dimension of a reference to an assumed size array.
答案 0 :(得分:1)
当该引用需要数组的形状时,假定大小的数组可能不会作为整个数组引用出现。作为写入语句中的输出项,这是一个不允许的情况。
所以,从这个意义上说,答案是:不,你不可能拥有写声明。
从假定大小的数组中,可能会出现数组部分和数组元素:
EXISTS
简单地引导如何将值write (*,*) a(1:2)
write (*,*) a(1), a(2)
write (*,*) (a(i), i=1,2)
放入子例程中;在其他时候可能需要2
。我们称之为7
。
当然,改变子程序很诱人:
n
甚至
subroutine writer (a,n)
integer n
integer a(n) ! or still a(*)
end subroutine
人们常常没有选择,尤其是在将程序与虚拟程序与特定界面相关联时。但是,subroutine writer (a)
integer a(:)
end subroutine
可以通过以下几种方式进入子例程:作为模块或主机实体,或通过公共块(如果可能,请避免使用此块)。这些方法不需要修改过程的接口。例如:
n
或者我们可以将subroutine writer(a)
use aux_params, only : n
integer, dimension(*), intent(in) :: a
write(*,*) a(1:n)
end subroutine writer
作为模块n
中的实体,并通过主机关联在fun
中访问它。在任何一种情况下,都需要在执行writer
之前在主程序中设置此n
的值。
答案 1 :(得分:0)
编译器不知道假定大小的数组有多大。它只有第一个元素的地址。你有责任告诉它有多大。
write(*,*) a(1:n)
等效地,您可以使用显式大小的数组
integer, intent(in) :: a(n)
然后你可以做
write(*,*) a