Visible to Intel only — GUID: GUID-02B3CB59-646E-4447-B738-8FE159A9AE72
Visible to Intel only — GUID: GUID-02B3CB59-646E-4447-B738-8FE159A9AE72
C_F_PROCPOINTER
Intrinsic Module Subroutine: Associates a Fortran procedure pointer with the target of a C function pointer.
Module
USE, INTRINSIC :: ISO_C_BINDING
Syntax
CALL C_F_PROCPOINTER(cptr, fptr)
cptr |
(Input) Is a scalar of derived type C_FUNPTR. Its value is the C address of a procedure. |
fptr |
(Output) Is a Fortran procedure pointer. It becomes pointer-associated with the target of cptr. |
Examples
Example 1
The following Fortran subroutine can be called from a C program that passes a pointer to a C function to be called:
SUBROUTINE CallIt (cp) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING
TYPE(C_FUNPTR), INTENT(IN) :: cp
ABSTRACT INTERFACE
SUBROUTINE Add_Int (i) BIND(C)
IMPORT
INTEGER(C_INT), INTENT(INOUT) :: i
END SUBROUTINE Add_Int
END INTERFACE
PROCEDURE(Add_Int), POINTER :: fp
INTEGER(C_INT) :: j
CALL C_F_PROCPOINTER (cp, fp)
j = 1
CALL fp(j)
...
Example 2
In the following C code, a function pointer to the C function foo is passed to the Fortran subroutine bar. bar converts the function pointer to a procedure pointer, and calls foo through the converted procedure pointer.
main.c:
#include <stdio.h>
extern void bar_ (void (**) (int*));
extern void foo (int *a){
printf (“ The value is %d\n”, *a)
}
int main () {
void (*fun_b)(int*) = NULL;
int *i;
int j = 10;
fun_b = foo;
i = &j;
printf (“Test in C\n”);
fun_b (i);
printf (“Test in Fortran\n”);
bar_ (&fun_b);
}
bar.f90
SUBROUTINE bar (c_fptr)
USE ISO_C_BINDING
TYPE(c_funptr) :: c_fptr
PROCEDURE(),POINTER :: proc_ptr
INTEGER(c_int) :: i = 20
CALL c_f_procpointer (c_fptr, proc_ptr)
CALL proc_ptr (i)
END SUBROUTINE bar
When these two files are compiled, linked, and executed, the output is:
Test in C The value is 10 Test in Fortran The value is 20