f2py Fortran函数接口编译错误

时间:2016-08-30 18:55:11

标签: fortran f2py

当我尝试编译FORTRAN子例程时,

f2py会出错,我从中调用另一个FORTRAN函数将数组传递给它。 我简化了代码,只留下问题。

SUBROUTINE MAS (matrix, a)
    IMPLICIT NONE
    INTERFACE
        LOGICAL FUNCTION LTRY(input_array)
            IMPLICIT NONE
            INTEGER*4 :: input_array(:,:)
        END FUNCTION LTRY
    END INTERFACE

    INTEGER*4 ::  matrix (:,:)
!f2py  INTENT(INOUT) :: matrix(:,:)
    INTEGER*4 a
!f2py INTENT(INOUT) :: a

    a = 1
    IF ( LTRY (matrix)) a = 2
END SUBROUTINE

LOGICAL FUNCTION LTRY(input_array)
    IMPLICIT NONE
    INTEGER*4 :: input_array (:,:)

    IF ( ANY(input_array == 0)) LTRY = .FALSE.
END FUNCTION LTRY

我尝试使用后编译它 f2py -c -m ptest ptest.f90 我收到了大量的错误。怎么了? 使用Ubuntu和gfortran编译器。

这是编译器输出(包含错误报告的部分):

gfortran:f77: /tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:16.35:
              function ltry(input) ! in :ptest:ptest.f90:mas:unkno
                                   1
Error: Unexpected junk after function declaration at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:18.72:
                  integer, dimension(:,:) :: input
                                                                        1
Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:19.72:
                  logical :: ltry
                                                                        1
Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:20.17:
              end function ltry
                 1
Error: Expecting END INTERFACE statement at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:40.32:
      ltryf2pywrap = .not.(.not.ltry(input_array))
                                1
Error: Operand of .not. operator at (1) is INTEGER(4)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:16.35:
              function ltry(input) ! in :ptest:ptest.f90:mas:unkno
                                   1
Error: Unexpected junk after function declaration at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:18.72:
                  integer, dimension(:,:) :: input
                                                                        1
Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:19.72:
                  logical :: ltry
                                                                        1
Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:20.17:
              end function ltry
                 1
Error: Expecting END INTERFACE statement at (1)
/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f:40.32:
      ltryf2pywrap = .not.(.not.ltry(input_array))
                                1
Error: Operand of .not. operator at (1) is INTEGER(4)
error: Command "/usr/bin/gfortran -Wall -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops -I/tmp/tmpSZHMCR/src.linux-i686-2.7 -I/usr/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c -c /tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.f -o /tmp/tmpSZHMCR/tmp/tmpSZHMCR/src.linux-i686-2.7/ptest-f2pywrappers.o" failed with exit status 1
Compilation failed.

有些错误看起来很奇怪。例如,编译器将逻辑函数视为整数。

1 个答案:

答案 0 :(得分:0)

不幸的是,您没有说明您获得了哪种类型的错误。 我试图在我的系统上编译它,我收到错误消息:

/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:16:35:

               function ltry(input) ! in :ptest:ptest.f90:mas:unkno
                                   1
Error: Unexpected junk after function declaration at (1)
/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:18:72: Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:19:72: Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:20:17:

               end function ltry
                 1
Error: Expecting END INTERFACE statement at (1)
/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:16:35:

               function ltry(input) ! in :ptest:ptest.f90:mas:unkno
                                   1
Error: Unexpected junk after function declaration at (1)
/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:18:72: Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:19:72: Error: Unexpected data declaration statement in INTERFACE block at (1)
/tmp/tmpLKy0jV/src.linux-x86_64-2.7/ptest-f2pywrappers.f:20:17:

               end function ltry
                 1
Error: Expecting END INTERFACE statement at (1)

查看包装文件,我们看到包装器做出了一个非常可疑的决定:它在行尾添加了注释,但随后将注释行换行而不在第二行中声明注释:< / p>

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

      subroutine f2pywrapmas (matrix, a, f2py_matrix_d0, f2py_matr
     &ix_d1)
      integer*4 a
      integer f2py_matrix_d0
      integer f2py_matrix_d1
      integer*4 matrix(f2py_matrix_d0,f2py_matrix_d1)
      interface
      subroutine mas(matrix,a) 
          integer*4, dimension(:,:) :: matrix
          integer*4 :: a
          interface  ! in :ptest:ptest.f90:mas
              function ltry(input) ! in :ptest:ptest.f90:mas:unkno
     &wn_interface
                  integer, dimension(:,:) :: input
                  logical :: ltry
              end function ltry
          end interface 
      end subroutine mas
      end interface
      call mas(matrix, a)
      end
但是,我不知道如何帮助你。但我建议您在问题中发布实际的错误消息。