- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
i want to compute the size of an interoperable type and register its value into an integer parameter, here is the code
module m_constant
use, intrinsic :: iso_c_binding
implicit none
type,bind (c) :: t_mytype
integer(kind=c_int) :: a
integer(kind=c_int) :: b
integer(kind=c_int) :: c
real(kind=c_double) :: d
end type t_mytype
type(t_mytype), private :: tmp_mytype
integer,parameter :: MYTYPE_CSIZE = c_sizeof(tmp_mytype)
end module m_constant
program test
use m_constant
use,intrinsic :: iso_c_binding
write(6,'(a,i4)') 'my type csize',MYTYPE_CIZE
end program test
The compiler ifort 17.0.1 can not compile the code and show:
qu@debian:~/Desktop/test/test_csize_of$ ifort test.f90 test.f90(16): error #6259: This array or function or substring is invalid in constant expressions. [C_SIZEOF] integer,parameter :: MYTYPE_CSIZE = c_sizeof(tmp_mytype)
I test also on a gfortran 5.2.0, i get MYTYPE_CIZE=24, and everything seems OK.
Is that a compiler bug ?
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Not a bug, but a feature of Fortran 2008 that is not yet implemented.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
There is a possible workaround:
module M1 use, intrinsic :: ISO_C_BINDING use, intrinsic :: ISO_C_BINDING, only: nothing=>C_SIZEOF implicit none private nothing end module M1 module M2 implicit none intrinsic SIZEOF end module M2 module ISO_C_BINDING_1 use M1 use M2, only: C_SIZEOF=>SIZEOF implicit none end module ISO_C_BINDING_1 module M3 use ISO_C_BINDING_1 implicit none type, BIND(C) :: T integer(C_INT) i real(C_DOUBLE) x end type T type(T), private :: T1 integer, parameter :: Tsize = C_SIZEOF(T1) end module M3 program P use ISO_C_BINDING_1 use M3 implicit none write(*,'(*(g0))') 'Tsize = ',Tsize end program P
Then you would have to change ISO_C_BINDING to ISO_C_BINDING_1. With gfortran, the distinction between the INTRINSIC and NON_INTRINSIC versions of module ISO_C_BINDING means that you don't need to rename to ISO_C_BINDING_1, but of course gfortran has already implemented this feature of f2008 anyhow, so this workaround isn't necessary in that case. Later, when ifort gets around to supporting this f2008 feature, you could rename ISO_C_BINDING_1 back to ISO_C_BINDING and get rid of module ISO_C_BINDING_1.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
RO,
Excellent!
You might add:
!DIR$ IF DEFINED(__INTEL_COMPILER)
...
!DIR$ ELSE
...
!DIR$ ENDIF
or something like that.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Repeat Offender wrote:
There is a possible workaround: ..
Why go through all that and employ a non-standard feature of SIZEOF when the Fortran standard also offers STORAGE_SIZE and is supported by Intel Fortran.
module m_constant
use, intrinsic :: iso_c_binding, only : c_int, c_double, c_sizeof, c_size_t
use, intrinsic :: iso_fortran_env, only : character_storage_size
implicit none
type,bind (c) :: t_mytype
integer(kind=c_int) :: a
integer(kind=c_int) :: b
integer(kind=c_int) :: c
real(kind=c_double) :: d
end type t_mytype
type(t_mytype), private :: tmp_mytype
integer(c_size_t), parameter :: MYTYPE_CSIZE = c_sizeof(tmp_mytype)
! if size desired in bytes, use named constant from ISO_FORTRAN_ENV to tranform the result in bits
integer, parameter :: MYTYPE_SIZE = storage_size(tmp_mytype)/character_storage_size
end module m_constant
program test
use, intrinsic :: iso_fortran_env, only : output_unit
use m_constant, only : MYTYPE_CSIZE, MYTYPE_SIZE
write ( output_unit, "(*(g0))") "MYTYPE_CSIZE = ", MYTYPE_CSIZE
write ( output_unit, "(*(g0))") "MYTYPE_SIZE = ", MYTYPE_SIZE
stop
end program test
Since gfortran supports both, here's the execution output using that compiler:
MYTYPE_CSIZE = 24 MYTYPE_SIZE = 24
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page