I am having a problem with a code that is trying to use c_f_pointer. It has a C routine which gets shared memory space and returns the C pointer to Fortran which creates a Fortran pointer to the space. A code snippet looks like this:
SUBROUTINE inshm_SegmentPtr_XXXXX_REAL4( handle, data_ptr, idims, iverb, ier ) INTEGER(KIND=4), INTENT(IN) :: handle REAL (KIND=4), DIMENSION(:,:,:,:,:), POINTER, INTENT(OUT) :: data_ptr INTEGER(KIND=4), dimension(5), INTENT(IN) :: idims INTEGER(KIND=4), INTENT(IN) :: iverb INTEGER(KIND=4), INTENT(OUT) :: ier TYPE(C_PTR) :: mem_ptr mem_ptr = inshm_SegmentPointer( handle, iverb ) ier = 0 call c_f_pointer(mem_ptr, data_ptr, idims) if( .NOT.associated( data_ptr ) ) ier = 1 write(6,*) '-- Assigned pointer, rank= ',idims write(6,*) ' size data_ptr = ',size(data_ptr) write(6,*) ' lbound data_ptr = ',lbound(data_ptr) write(6,*) ' ubound data_ptr = ',ubound(data_ptr) data_ptr= 0.0 write(6,*) '-- Initialized data in pointer' END SUBROUTINE inshm_SegmentPtr_XXXXX_REAL4
When it runs,
[inSHM] global 0 created handle 0
[inSHM] global 0 got seg. id 996180052
[inSHM] global 0 has handle 0
size data_ptr = 3461472
lbound data_ptr = 1 1 1 1 1
ubound data_ptr = 12 101 56 1 51
Thread 1 "us3d-general.bi" received signal SIGSEGV, Segmentation fault.
0x00001555375eaab1 in fpv::fpvinit (ier=0) at ../../module/FPV.f:426
426 EVMq = 0.0
Fortran thinks the pointer is associated, it knows the size and upper and lower bounds. However, as soon as I try to access the memory (initializing data_ptr= 0.0) I get a segmentation fault.
The same code works as expected without errors in GCC and PGI compilers, but it dies with Intel. I am not sure if it is something the routines are doing incorrectly or if it is a compiler bug. Help would be greatly appreciated.
A small working example which illustrates the problem can be found here:
The fdemo1.f routine which is included works fine with other compilers but dies using Intel. We have tried different Intel Fortran versions including the latest 2019 release.
It may help to print out the hex value of mem_ptr after it is initialized. Compare this with the base address of the array as known by C.
*** Note, this base address must be a contiguous blob of data representing your multi-dimensional C array. IOW not the address of a typical array of pointers to dis-contiguous memory. Example relating to the "I get" information:
float* Blob = new float[12*101*56*1*51];
// now create the pointer tables within the blob...