2012-12-06 3 views
2

У меня есть длинный код fortran, который должен быть использован для использования с python. Я решил использовать интерфейс Fortran-> C-> Python.интероперабельность c-fortran - производные типы с указателями

У меня проблема: я вывел типы в Fortran-модулей, которые содержат

double precision, allocatable 

типа в качестве членов.

При попытке компиляции с ifort я получаю (с gfortran что-то похожее):

Each component of a derived type with the BIND attribute shall be a nonpointer,   
nonallocatable data component with interoperable type and type parameters 

Это на самом деле с соглашением с компилятором документации Intel и стандарт Fortran 2003: пункт 15.2.5.

Есть ли способ получить доступ к «типу» Фортрана с выделенным или указателем внутри?

ответ

1

Не совсем. Даже совершенно новый TS 29113 не предлагает решения. Он имеет TYPE(*), но вы должны знать, как декодировать структуру в C. Вы можете сделать это путем обратного проектирования.

На самом деле существует макрос для размера структуры в упомянутых TS. См. CFI_attribute_allocatable. Но проблема с разыменованием остается. Существует стандартный дескриптор массива, но этот TS еще не поддерживается некоторыми компиляторами (в частности, gfortran).

Возможно, просто передать указатель на структуру общей функции, такой как qsort. Затем вы используете только часть памяти, которая, как оказалось, содержит также некоторый указатель или выделяемый дескриптор, но C не должен знать о них.

Другая возможность состоит в том, чтобы построить производный тип, который содержит только type(c_ptr) вместо указателей Фортрана и использует c_loc(), чтобы заполнить их. Тогда обязательно должны быть только смежные массивы.

+0

Для каждого экземпляра объекта, тип которого является моим производным типом, я знаю фактический размер включенных массивов. Они могут быть разными для каждого экземпляра. Я мог бы справиться с разыменованием. Возможно, я не расстаюсь с проблемой. Для меня указатель - это просто адрес в памяти, и что-то вроде struct { int * a int * b int * c }; имеет размер 3 * sizeof (int *), который обычно оценивается до 24 байтов (это значение может быть равно только 12 байтам, но оно может быть определено для каждого компьютера раз и навсегда). Что в Фортране отличается? Указатель в Fortran сильно отличается от указателя на C? – Lacek

+1

Указатели в Фортране и еще более выделяемые компоненты - это больше, а затем просто адреса. Например, они могут указывать на несмежные массивы. –