Visible to Intel only — GUID: GUID-0DE43B62-98AB-4BA5-AFAB-783BDFAE2101
Visible to Intel only — GUID: GUID-0DE43B62-98AB-4BA5-AFAB-783BDFAE2101
Pointers
For interoperating with C pointers, the module ISO_C_BINDING contains the derived types C_PTR and C_FUNPTR, which are interoperable with C object and function type pointers, respectively.
These types, as well as certain procedures in the module, provide the mechanism for passing dynamic arrays between the two languages. Because its elements do not need to be contiguous in memory, a Fortran pointer target or assumed-shape array cannot be passed to C. However, you can pass an allocated allocatable array to C, and you can associate an array allocated in C with a Fortran pointer. Additionally, as shown in the following, you can convert a pointer in C format to one in Fortran format.
Fortran program example:
program demo_c_f_pointer
use, intrinsic :: iso_c_binding
implicit none
interface
function make_array(n_elements) bind(C)
import ! Make iso_c_binding visible here
type(C_PTR) :: make_array
integer(C_INT), value, intent(IN) :: n_elements
end function make_array
end interface
type(C_PTR) :: cptr_to_array
integer(C_INT), pointer :: array(:) => NULL()
integer, parameter :: n_elements = 3 ! Number of elements
! Call C function to create and populate an array
cptr_to_array = make_array(n_elements)
! Convert to Fortran pointer to array of n_elements elements
call C_F_POINTER (cptr_to_array, array, [n_elements])
! Print value
print *, array
end program demo_c_f_pointer
C module example:
#include <stdlib.h> int *make_array(int n_elements) { int *parray; int i; parray = (int*) malloc(n_elements * sizeof(int)); for (i = 0; i < n_elements; i++) { parray[i] = i+1; } return parray; }