2017-08-16 33 views
1

在模块中声明的整数变量被用作一个全局变量以限定在节目相关的阵列的大小。程序的大小不同,所以数组的大小是一个变量,但不是一个参数。这是在节目开始时确定的。模块或主程序阵列必须具有恒定的形状误差用Fortran

在下面的代码段中,n是全球大小可变。它在模块中声明并在主函数/程序的开始处定义。主程序中n的相似用法和主程序中包含的子程序分别初始化一个数组。但是,主程序中的初始化错误:模块或主程序数组必须具有恒定的形状误差,但子程序中的初始化工作。在不同位置使用非恒定值的不同处理背后的机制是什么?

module mod 
    implicit none 
    integer :: n 
end module mod 



program main 
    use mod 
    implicit none 
    integer :: b(n) 
    n = 5 
    b(:) = 1 
    print*, b(:) 

    call sub 

contains 

    subroutine sub 
    integer :: a(n) 
    a = 10 
    print*, a 
    end subroutine sub 

end program main 
+0

n的值是整数的声明:: B(N)的那一刻未知的,所以你应该使用这样的:整数,指针:B(:); n = 5;分配(b)或整数,参数:: nn = 5; integer :: a(nn); n = nn – albert

回答

1

数组声明如下a(n)显形阵列。当n不是一个常数(命名或以其他方式,严格意义上的常量表达式)这种阵列是一种自动对象

自动对象在哪里,他们可能会出现限制。特别地,显式的外形阵列受到以下约束(F2008的C531):从模块mod

An explicit-shape-spec whose bounds are not constant expressions shall appear only in a subprogram, derived type definition, BLOCK construct, or interface body.

作为n不是一个常数它不能用作在主程序的阵列的边界。子程序sub是一个子程序,所以a(n)是一个非常量限制的有效用法。

代替具有在主程序自动对象的,可以代替考虑延迟的外形阵列,即使用pointerallocatable属性。

相关问题