Fortran EQUIVALENCE语句具有子例程输入的数组长度

问题描述 投票:0回答:1

[我正在对一些旧的Fortran代码进行现代化处理,但我无法摆脱某个地方的等效语句(长话短说:混合使用太复杂了,要转换所有内容都需要太多的工作)。

我需要等值数组的长度取决于某些输入,如以下代码:

program test_equivalence                                                
      implicit none                                                     

      type :: t1                                                        
          integer :: len = 10                                           
      end type t1                                                       

      type(t1) :: o1                                                    


      call eqv_int(o1%len)                                              
      call eqv(o1)                                                      

      return                                                 

      contains                                                          
          subroutine eqv_int(len)                                       
             integer, intent(in) :: len                                 
             integer :: iwork(len*2)                                    
             real(8) :: rwork(len)                                      
             equivalence(iwork,rwork)                                   

             print *, 'LEN = ',len                                      
             print *, 'SIZE(IWORK) = ',size(iwork)                      
             print *, 'SIZE(RWORK) = ',size(rwork)                      
          end subroutine eqv_int                                        

          subroutine eqv(o1)                                            
             type(t1), intent(in) :: o1                                 

             integer :: iwork(o1%len*2)                                 
             real(8) :: rwork(o1%len)                                   
             equivalence(iwork,rwork)                                   

             print *, 'LEN = ',o1%len                                   
             print *, 'SIZE(IWORK) = ',size(iwork)                      
             print *, 'SIZE(RWORK) = ',size(rwork)                      
          end subroutine eqv                                            
end program test_equivalence                                            

该程序将使用gfortran 9.2.0创建长度为0的数组。这是输出:

 LEN =           10
 SIZE(IWORK) =            0
 SIZE(RWORK) =            0

 LEN =           10
 SIZE(IWORK) =            0
 SIZE(RWORK) =            0

使用gfortran 5.3.0编译时,相同的代码将返回Array 'rwork' at (1) with non-constant bounds cannot be an EQUIVALENCE object,该警告自gfortran 6.2.0起消失,但数组的大小始终为0。那么也许是编译器错误?

fortran gfortran equivalence
1个回答
0
投票

源代码确实不是有效的Fortran程序。具体而言,它违反了Fortran 2018的数字约束 C8106:

equivalence-object不得是基础对象为..自动数据对象..的指定者。>

作为编号约束,编译器必须有能力

检测到此冲突。如果没有这样的功能,那就是编译器中的一个缺陷(一个错误)。默认情况下,“具有能力”并不意味着要这样做,因此请仔细查看是否有确实导致此检测的选项。
© www.soinside.com 2019 - 2024. All rights reserved.