gfortran和ifort函数的不同行为返回派生类型

时间:2013-06-12 15:31:23

标签: fortran gfortran intel-fortran fortran-iso-c-binding derived-types

我正在开发一个需要在Fortran中存储派生类型属性的内存地址的项目。在gfortran中发现的是,如果返回是派生类型,则返回函数的隐式副本。所以我存储的地址毫无意义。有一段代码:

module atest
!  use iso_c_binding
  type test
    real(8):: a
    real(8):: p
  end type test
  interface
    subroutine pointerprint(a)
      real(8), intent(in) :: a
    end subroutine pointerprint
  end interface
  interface assignment(=)
    module procedure overloadedAsgn
  end interface
contains
  function returnvalue(t)
    type(test), intent(in)::t
    type(test):: returnvalue
    returnvalue%a=t%a+1
    call pointerprint(returnvalue%a)
  end function returnvalue
  SUBROUTINE overloadedAsgn(ret,rhs)
    type(test), intent(inout) :: ret
    type(test), intent(in) :: rhs
    print *, "assign_d"
    ret%a=rhs%a
    ret%p=rhs%p+1.0d0
    call pointerprint(rhs%a)
  end SUBROUTINE overloadedAsgn  

end module

program xxx
  use atest
  type(test):: t
  type(test):: b
  t%a=1.0d0/11.0d0
  t%p=0.0d0
  b=returnvalue(t)
end program 


#include<stdio.h>
void pointerprint_(double *x){
  printf("Addr<%lx>\n",(unsigned long)x);
}

使用gfortran的输出是:

Addr<7fff51df24e0>
 assign_d
Addr<7fff51df2520>

使用ifort的输出是:

Addr<7fffc92e6fc0>
 assign_d
Addr<7fffc92e6fc0>

有没有办法在gfortran中避免这样的副本,所以结果是一致的?我刚开始学习fortran。可能有函数的描述符或编译器的选项。

1 个答案:

答案 0 :(得分:1)

您依赖于与处理器相关的行为。如果处理器有利可图,则处理器可以通过拷入(和/或外出)进行传递。您可以使用指针伪参数来传递指针。

您的代码中没有任何TARGET,但仍希望依赖指向变量的指针。