FORTRAN on X86 : non equivalent variables in a module can have the same memory address.
Posted: Mon Nov 20, 2023 10:43 am
Hi
I get the following:
Two variables names and no_defined_names which are NOT equivalent seem to the same address (8192). This is not correct.
I tried to make the example simpler, but every time you change something to the module yoiu gert different results. I saw this problem also in other modules. All of them contained equivalence statements.
regards
Jouk
I get the following:
Code: Select all
rumba-jj) f90/vers
VSI Fortran x86-64 X8.5-007 (GEM 50XBD) on OpenVMS x86_64 V9.2-1
rumba-jj) ty module_names.f90
module module_names
!
integer ( kind = 4 ) :: r1( 21 ),r2(0:255 , 21 ),r3, &
& r4 , r5(5),r6,r7,r6DEF, &
& r8(5),r9,r10,r11,r9DEF, &
& r12(5),r13,r14,r15,r13DEF, &
& r16(5),r17,r18, &
& r19(5),r20,r21 , r22( 18 )
character ( len = 64 ) :: names( 0:501 )
integer ( kind = 4 ) :: p1 , p2 , p3 , &
& c2 , c3 = 125
integer ( kind = 4 ) :: r1def , r10def
logical ( kind = 4 ) :: p4( 21 )
integer ( kind = 4 ) :: p5( 21 ) , p6( 0:501 &
& ) , p7 , for_p1 , for_p3 , &
& r4num , p8( 18 ) , p9 , p10
integer ( kind = 1 ) :: p11
logical ( kind = 4 ) :: p12 , unicode = .false.
integer ( kind = 4 ) :: r22_part( 18 ) , no_defined_names
integer ( kind = 4 ) :: c1
character*64 names1( 0:50 ) , names2( 50 )
character*64 names3( 50 ) , names4( 50 )
character*64 names5( 50 ) , names6( 50 )
character*64 names7( 50 ) , names8( 50 )
!
equivalence( names( 0 ) , names1( 0 ) )
equivalence( names( 51 ) , names2( 1 ) )
equivalence( names( 101 ) , names3( 1 ) )
equivalence( names( 151 ) , names4( 1 ) )
equivalence( names( 201 ) , names5( 1 ) )
equivalence( names( 251 ) , names6( 1 ) )
equivalence( names( 301 ) , names7( 1 ) )
equivalence( names( 351 ) , names8( 1 ) )
!
data names1 / 51*' ' /
data names2 / 50*' ' /
data names3 / 50*' ' /
data names4 / 50*' ' /
data names5 / 50*' ' /
data names6 / 50*' ' /
data names7 / 50*' ' /
data names8 / 50*' ' /
data no_defined_names / 383 /
DATA r5 /5*0/
DATA r8 /5*0/
DATA r12 /5*1/
DATA r16 /5*1/
DATA r19 /5*0/
DATA r4 /5/
DATA r3 /0/
DATA r6 /0/
DATA r9 /0/
DATA r13 /1/
DATA r17 /1/
DATA r20 /0/
data p1 /4/
data p3 /5/
data p2 /1/
data c2 /5/
data p7 / 0 /
data for_p1 / 4 /
data for_p3 / 5 /
data p9 /0/
!
end module module_names
20-NOV-2023 16:37:10
rumba-jj) ty test.f90
program test
use module_names
integer i
i = %loc( names )
write(*,*) %loc( names ) , %loc( names8 )
write(*,*) %loc(no_defined_names) , (%loc(no_defined_names) -i ) / 64
end
20-NOV-2023 16:37:16
rumba-jj) f90 module_names
rumba-jj) f90 test.f90
rumba-jj) link test,module_names
rumba-jj) run test
8192 30656
8192 0
I tried to make the example simpler, but every time you change something to the module yoiu gert different results. I saw this problem also in other modules. All of them contained equivalence statements.
regards
Jouk