I recently came across a situation where I wanted to call a C function from Fortran, because of a useful snippet of C code. For convenience in array operations, I wanted to be able to call this function with array arguments as well, but it only accepted scalar arguments.
In Fortran, one can of course simply declare a procedure to be elemental to achieve this, and one can declare an interface to a C procedure with bind(C). However, since C does not have the concept of elemental procedures, the Fortran (2008) standard rules out this combination:
C1246 An elemental procedure shall not have the BIND attribute.
So, can this functionality be achieved in Fortran?
After some searching, I found that this is both possible and quite straightforward, using Fortran 2003 and the
iso_c_bindingintrinsic module; I thought I should document this here. An interface with thebindattribute can still bepure, so it can be referenced within a Fortran procedure which is itselfelemental.The following is a short example with the C99 macro
isnan, which returns a non-zero integer value if its argument is NaN. Of course, this can also be done for any user-defined C/C++ function that is free of side effects.Example output using an array with some NaN values: