为什么带有假定形状参数的子例程不能具有内部函数?

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

我有一个带有假定形状数组的子例程,该例程还包含一个内部函数:

subroutine test(x)
   real x(:)
contains
   function a()
   end
end

[当我尝试用f2py(f2py -c test.f90 -m test)进行编译时,将显示以下错误:

gfortran:f77: /tmp/tmphb_l9bkr/src.linux-x86_64-3.7/test-f2pywrappers.f
/tmp/tmphb_l9bkr/src.linux-x86_64-3.7/test-f2pywrappers.f:11:10:

           function a() ! in :test:test.f90:test
          1
Error: Unclassifiable statement at (1)
/tmp/tmphb_l9bkr/src.linux-x86_64-3.7/test-f2pywrappers.f:13:13:

           end function a
             1
Error: Expecting END SUBROUTINE statement at (1)

但是,如果我删除内部函数a()或为数组赋予明确的形状(例如real x(5)),则可以正常编译。上面给出的代码有什么问题?

python numpy fortran f2py
1个回答
0
投票

情况似乎很特殊。为了更加确定,出于end function a错误消息的原因,我添加了完整的end语句

subroutine test(x)
   real x
contains
   function a()
   end function a
end subroutine test

您可以在错误消息中看到,gfortran错误不是来自原始源代码,而是来自/tmp/目录中的其他源代码。如果打开它,它看起来像这样:

C     -*- fortran -*-
C     This file is autogenerated with f2py (version:2)
C     It contains Fortran 77 wrappers to fortran functions.

      subroutine f2pywraptest (x, f2py_x_d0)
      integer f2py_x_d0
      real x(f2py_x_d0)
      interface
      subroutine test(x) 
          real, dimension(:) :: x
          function a() ! in :nestedf:nestedf.f90:test
          end function a
      end subroutine test
      end interface
      call test(x)
      end

这是一个包装程序,旨在调用您的子例程。这样做的原因是使Python可以更轻松地调用您的代码,而无需Python理解假定的shape参数。但是,f2py在创建接口时无法正确理解内部功能。

不幸的是,您必须选择。您可以使用假定的shape参数,也可以使用内部函数。但是f2py不能同时理解两者。

© www.soinside.com 2019 - 2024. All rights reserved.