func_derived_3.f90
来自「linux下编程用 编译软件」· F90 代码 · 共 126 行
F90
126 行
! { dg-do run }! This tests the "virtual fix" for PR19561, where pointers to derived! types were not generating correct code. This testcase is based on! the original PR example. This example not only tests the! original problem but throughly tests derived types in modules,! module interfaces and compound derived types.!! Original by Martin Reinecke martin@mpa-garching.mpg.de ! Submitted by Paul Thomas pault@gcc.gnu.org! Slightly modified by Tobias Schlütermodule func_derived_3 implicit none type objA private integer :: i end type objA interface new module procedure oaInit end interface interface print module procedure oaPrint end interface private public objA,new,printcontains subroutine oaInit(oa,i) integer :: i type(objA) :: oa oa%i=i end subroutine oaInit subroutine oaPrint (oa) type (objA) :: oa write (10, '("simple = ",i5)') oa%i end subroutine oaPrintend module func_derived_3module func_derived_3a use func_derived_3 implicit none type objB private integer :: i type(objA), pointer :: oa end type objB interface new module procedure obInit end interface interface print module procedure obPrint end interface private public objB, new, print, getOa, getOa2contains subroutine obInit (ob,oa,i) integer :: i type(objA), target :: oa type(objB) :: ob ob%i=i ob%oa=>oa end subroutine obInit subroutine obPrint (ob) type (objB) :: ob write (10, '("derived = ",i5)') ob%i call print (ob%oa) end subroutine obPrint function getOa (ob) result (oa) type (objB),target :: ob type (objA), pointer :: oa oa=>ob%oa end function getOa! without a result clause function getOa2 (ob) type (objB),target :: ob type (objA), pointer :: getOa2 getOa2=>ob%oa end function getOa2 end module func_derived_3a use func_derived_3 use func_derived_3a implicit none type (objA),target :: oa type (objB),target :: ob character (len=80) :: line open (10, status='scratch') call new (oa,1) call new (ob, oa, 2) call print (ob) call print (getOa (ob)) call print (getOa2 (ob)) rewind (10) read (10, '(80a)') line if (trim (line).ne."derived = 2") call abort () read (10, '(80a)') line if (trim (line).ne."simple = 1") call abort () read (10, '(80a)') line if (trim (line).ne."simple = 1") call abort () read (10, '(80a)') line if (trim (line).ne."simple = 1") call abort () close (10)end program
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?