编写假定大小的数组导致"上限不得省略..."

时间:2017-12-28 19:33:28

标签: fortran

我正在编写代码来添加一个封闭源的有限元框架,这个框架迫使我(由于依赖于一些旧的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.

2 个答案:

答案 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