- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi.
In my program I have several procedure pointers in a large derived type (with sub derived types). However, the pointers seem to become unassociated for some specific cases and I don't understand why. I would be very grateful if someone can give me hints on what I'm doing wrong and how a more stable behavior can be achieved!
Below is an as small example as I was able to create to show the behavior.
I get the following output depending on my settings (A,B,C):
A: As below
B: Comment out line 28
C: Comment out line 90 and 92, remove comment on line 89
Earlier in the digging down I also experienced a case D, but I haven't been able to reproduce this in a smaller example...
Setting = A | B | C | D get_lev2_2, lev2_2%addr : T T T T get_lev1_2, lev1_2_tmp(1)%lev2_2%addr: F T T T get_lev1_2, lev1_2(1)%lev2_2%addr : F T F T get_main, main%lev1_2(1)%lev2_2%addr : F T F T get_main, main%lev1_1%addr : T T T T top_level, main%lev1_1%addr : T T T T top_level, main%lev1_2(1)%lev2_2%addr: F T F F
This is running with Visual Studio 2012 and ifort 14.0.1.139
Running the same example on linux with ifort 18.0.1 and gfortran 7.3.0 all tests are true.
module tmpl_mod
implicit none
abstract interface
subroutine sub_template(x,f)
double precision, intent(in) :: x(:)
double precision :: f(size(x))
end subroutine
end interface
contains
end module tmpl_mod
module types_mod
use tmpl_mod
implicit none
type lev1_1_typ
integer :: k1
procedure(sub_template),pointer,nopass :: addr
end type
type lev2_2_typ
procedure(sub_template),pointer,nopass:: addr
end type
type lev1_2_typ
integer :: k1
type(lev2_2_typ) :: lev2_2
end type
type main_typ
type(lev1_1_typ) :: lev1_1
type(lev1_2_typ), allocatable :: lev1_2(:)
end type main_typ
end module types_mod
module ass_mod
use tmpl_mod
implicit none
character(len=4), parameter :: lib_ext = '.dll'
contains
subroutine sub(x,f)
double precision, intent(in) :: x(:)
double precision :: f(size(x))
f = 2.d0*x
end subroutine
subroutine ass_sub(proc_ptr)
implicit none
procedure (sub_template), pointer :: proc_ptr
proc_ptr => sub
end subroutine
end module ass_mod
module get_mod
use types_mod
use ass_mod
implicit none
contains
subroutine get_main(main)
implicit none
type(main_typ) :: main
call get_lev1_1(main%lev1_1)
call get_lev1_2(main%lev1_2)
write(*,*) 'get_main, main%lev1_2(1)%lev2_2%addr: ', associated(main%lev1_2(1)%lev2_2%addr)
write(*,*) 'get_main, main%lev1_1%addr : ', associated(main%lev1_1%addr)
end subroutine
subroutine get_lev1_1(lev1_1)
implicit none
type(lev1_1_typ) :: lev1_1
call ass_sub(lev1_1%addr)
end subroutine
subroutine get_lev1_2(lev1_2)
implicit none
type(lev1_2_typ), allocatable :: lev1_2(:)
!type(lev1_2_typ) :: lev1_2_tmp(3)
type(lev1_2_typ), allocatable :: lev1_2_tmp(:)
integer :: stype, k1
allocate(lev1_2_tmp(3))
k1 = 1
call get_lev2_2(lev1_2_tmp(k1)%lev2_2)
allocate(lev1_2(k1))
lev1_2 = lev1_2_tmp(1:k1)
write(*,*) 'get_lev1_2, lev1_2_tmp(1)%lev2_2%addr:', associated(lev1_2_tmp(1)%lev2_2%addr)
write(*,*) 'get_lev1_2, lev1_2(1)%lev2_2%addr : ', associated(lev1_2(1)%lev2_2%addr)
end subroutine
subroutine get_lev2_2(lev2_2)
implicit none
type(lev2_2_typ), intent(inout) :: lev2_2
call ass_sub(lev2_2%addr)
write(*,*) 'get_lev2_2, lev2_2%addr: ', associated(lev2_2%addr)
end subroutine
end module get_mod
program top_level
use types_mod
use get_mod
implicit none
type(main_typ) :: main
call get_main(main)
write(*,*) 'top_level, main%lev1_1%addr : ', associated(main%lev1_1%addr)
write(*,*) 'top_level, main%lev1_2(1)%lev2_2%addr: ', associated(main%lev1_2(1)%lev2_2%addr)
end program
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It seems you already solved the problem by not using a five-year-old compiler. It would appear that you encountered a bug in the 14.0 compiler.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It seems you already solved the problem by not using a five-year-old compiler. It would appear that you encountered a bug in the 14.0 compiler.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you Steve, that's good news that you think this is the reason!
I was afraid that my code was written in a bad way causing it to be unstable (I've learnt to never blame compiler bugs as it is usually my own bugs...)
//Knut
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page