Я соединяю некоторый устаревший код между fortran и C, используя привязку iso-c и модули/интерфейсы и т. д.
Обычно при передаче массива fortran в C я просто копировал его в другой массив правильного типа iso-c-binding. Однако некоторая часть кода требует, чтобы я передал большой (несколько ГБ) массив. В этом случае копирование не имеет смысла. Кроме того, поскольку он исходит из стороннего кода, изменение типа массива fortran no use real(c_float)
также невозможно.
Однако я был бы рад создать исключение или не скомпилировать, если базовый массив fortran был несовместим с API-интерфейсом C на основе float.
Есть ли способ проверить, совместим ли real
по умолчанию с C float
или double
во время компиляции (или во время выполнения)?
Я использую компиляторы Intel fortran и C, если это имеет значение.
REAL*4
, а неREAL*8
для двойной точности — была ли это ДВОЙНАЯ ТОЧНОСТЬ? — так что шансы, что Fortran REAL — это то же самое, что C float, очень высоки. И если бы по какой-то случайности или ухищрению оказалось, что Fortran REAL был Cdouble
, вы бы смогли использовать нескопированный массив, не так ли? AFAICR, если вы измените массив в коде C, он изменится и в вызывающей функции — точно так же, как в C. - person Jonathan Leffler   schedule 23.03.2016real (OriginalArray, c_float)
. ЕслиOriginalArray
имеет тот же тип, что иc_float
, можно надеяться, что встроенныйreal
записывается сразу после массива. Если это другой тип, то будет создана временная копия типаc_float
. Может памяти хватило бы... - person M. S. B.   schedule 23.03.2016