Issues interfacing between C++ and Fortran

Yes, I believe both your points are correct. The interface should be:

    real(c_double) function C_UsesFortranArray_maxval(ptr) &
        bind(c,name="C_UsesFortranArray_maxval")
      import c_ptr, c_double
      type(c_ptr), intent(in), value :: ptr
    end function

I will amend the snippet above.