1

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でそのようなコピーを回避する方法はありますか? フォートランを習い始めたばかりです。関数の記述子またはコンパイラのオプションがある場合があります。

4

1 に答える 1

1

プロセッサに依存する動作を期待しています。プロセッサは、収益性が高い場合、コピーイン (および/またはアウト) で通過する場合があります。ポインター仮引数を使用してポインターを渡すことができます。

コードには何もありませんがTARGET、変数へのポインターに依存したい場合。

于 2013-09-23T23:01:48.267 に答える