Fortran中的子例程无法识别类型

时间:2018-08-05 21:56:47

标签: types fortran subroutine

我有以下代码

module oc_tree

    type star
        integer :: id
        real(8) :: v(3)=0, r(3)=0
    end type

    type node
        real(8) :: corners(3,2)
        type(node), dimension(:), pointer :: child_nodes
        type(node), pointer :: father
        type(star), allocatable :: stars_in(:)
        real(8) :: tot_mass, center_mass(3)
        integer :: id
    end type node


    contains

    subroutine head_node(n2,m, stars, node1)
        real(8), intent(IN) ::m
        integer, intent(IN) :: n2
        type(star), allocatable, dimension(:), intent(in) :: stars
        real(8), parameter :: parsec = 3.085677581d16, d = 6661d3*parsec
        integer :: i

        type(node), intent(OUT) :: node1

        procedure...

    end subroutine head_node

   recursive subroutine tree(m, node1)
        type(node), intent(inout), target :: node1
        integer :: i, n, j, last_id
        real(8) :: c(3,2), r1(3)
        type(node), pointer :: node

        node => node1


        call child_cubes(node)

        procedure...

        end  subroutine tree

        subroutine child_cubes(node)
            type(node), intent(inout), target :: node
            real(8) :: x_mid, y_mid, z_mid, c(3,2)
            integer :: i

         procedure

        end subroutine child_cubes



end module oc_tree

出于某种原因,在子程序“ child_cubes”中,编译器说的是

  

“ / home / avner / Dropbox /最终项目/grav/main.f95 | 176 |错误:派生   类型“ node”在使用之前就已经被使用”

尽管在第一个子例程中他没有问题。我不理解两个第一个子例程之间的区别,这有什么想法吗?

1 个答案:

答案 0 :(得分:1)

尝试使用gfortran 4.8.5进行编译时,编译器在第37行抛出以下提示错误

type(node), pointer :: node
                           1   2
Error: The type 'node' cannot be host associated at (1) because it is
       blocked by an incompatible object of the same name declared at (2)

除了第49行的错误

type(node), intent(inout), target :: node
          1
 Error: Derived type 'node' at (1) is being used before it is defined

所以问题是subroutine child_cubes的哑元参数和subroutine tree的内部指针变量都与类型和类型具有相同的名称(node)。因此阴影类型。将这些名称更改为node2或通过某种方法可以解决此问题(实际上,只要重命名{{1}的虚拟变量,intel编译器就可以使用与类型相同的名称的内部指针变量},那么哪个子例程会引起问题取决于编译器。