Совместимость Fortran-C и массивы с плавающей точкой
У меня есть большой существующий код Fortran95. Оно использует
real(dp), dimension(num) :: array
объявить массивы.
Я хочу присоединиться к некоторому коду C и обнаружил, что могу сделать это, написав интерфейсы для C-функций и объявив массивы как
use iso_c_binding
real(c_double), allocatable, target :: array(:)
У меня есть работающие Fortran функции, которые вызывают C-функции как
call myfunction(c_loc(array));
Что нужно для прохожденияreal(dp)
массив к моей функции? Видимо, мне нужно было бы сделать из него C-указатель (как?). Есть ли другой способ, кроме копирования массива? Можно ли гарантировать, что оба типа действительно относятся к совместимым блокам данных двойной точности? Самое главное, решение должно работать с компиляторами GNU. Обратите внимание, что заменаreal(dp)
сreal(c_double)
повсюду в существующем коде Фортрана для меня сейчас не вариант.
Если нет альтернативы копированию всего массива, как бы я сделал это правильно в интерфейсе?