Выделяемые массивы, массивы указателей, а также предполагаемые аргументы массива форм обрабатываются с помощью дескриптора массива (также называемого вектором допуска).
У любого компилятора может быть своя структура дескриптора массива. Его можно найти в руководстве к компилятору. Но есть стандартизированный формат для дескриптора, который используется для связи с C (и, возможно, с другим программным обеспечением за пределами Fortran, которое может взаимодействовать с C.
Этот стандартный дескриптор не может использоваться компилятором внутри компании, но может. Если он используется также внутри, компилятору не нужно подготавливать новый дескриптор при вызове C-совместимой процедуры. Например, gfortran планирует, что стандартный дескриптор будет поддерживаться «предпочтительно в собственном формате» .
Пример дескриптора собственного массива, отличного от C-совместимого, описан Intel по адресу https://software.intel.com/en-us/node/678452.
Структура дескриптора массива для аргументов массива, совместимого с C, определена Технической спецификацией ISO / IEC TS 29113: 2012 о дальнейшей совместимости Fortran с C, которая должна стать частью Fortran 2015.
В заголовочном файле C ISO_Fortran_binding.h
определяется структура C, которая определяется дескриптором Fortran (предполагаемая форма, указатель или размещаемый).
Выглядит это так (из веб-сайт IBM, некоторые детали могут зависеть от компилятора):
CFI_cdesc_t
A type definition that describes a C descriptor. It contains the following structure members:
void *base_addr
The base address of the data object that is described. For deallocated allocatable objects, base_addr is NULL.
size_t elem_len
For scalars: The size in bytes of the data object that is described.
For arrays: The size in bytes of one element of the array.
int version
The version number of the C descriptor. Currently, the only valid value is available by using the CFI_VERSION macro.
CFI_attribute_t attribute
The attribute code of the C descriptor. For the valid values for attribute, see Table 1.
CFI_type_t type
The type code of the C descriptor. Describes the type of the object that is described by the C descriptor. For the valid values for type, see Table 2.
CFI_rank_t rank
The rank of the object that is described by the C descriptor. Its value must be in the range 0 ≤ rank ≤ CFI_MAX_RANK. A value of 0 indicates that the object is a scalar. Otherwise, the object is an array.
CFI_dim_t dim[]
An array of size rank that describes the lower bound, extent, and stride of each dimension.
There is a reserved area between rank and dim. The size of the reserved area is 12 words in 32-bit mode and 9 words in 64-bit mode.
Указанные типы CFI_
также определены в заголовке ISO_Fortran_binding.h
.
Итак, хотя этот дескриптор может не совпадать с тем, который ваш компилятор использует для внутренних целей, это хороший пример того, какие компоненты данных следует ожидать в дескрипторе массива Fortran.
Однако будьте осторожны, gfortran, очень распространенный компилятор, еще не использует этот тип дескриптора. Существует только экспериментальная версия с новым дескриптором, а текущий дескриптор описан в руководстве.
person
Vladimir F
schedule
24.02.2017