2013-06-26 2 views
0

Это то, что я хочу сделать:Как использовать целое значение наследственного компонента в качестве длины массива в расширении

type dataframe 
    integer::a,d 
    integer,dimension(:),allocatable::n 
    end type dataframe 

    type,extends(dataframe):: datafilled 
    double precision,dimension(sum(n),d)::x 
    end type datafilled 

Так dataframe должен быть в состоянии хранить информацию о размере для своего ребенка datafilled. gfortran хочет знать тип n для компиляции, но, на мой взгляд, он уже унаследован. (Доказательство. Если я определю n в datafilled, gfortran жалуется на дублирование.) Как я могу заставить его работать?

Примечание: Я объявляю n подлежащим размещению в соответствии с this question и потому, что gfortran, очевидно, пока не поддерживает атрибут len Fortran2003.

EDIT: Хорошо, я признаю, что могу сделать это с атрибутом allocatable и allocate на каждом этапе инициализации позже.

ответ

1

Существуют ограничения на то, что может быть в спецификации массива компонентов, что для компонентов, не предназначенных для распределения/не указателя, позволяет оценивать спецификацию во время компиляции (в том случае, когда объявление типа для объекта типа определяется). В частности, значение привязки в спецификации не должно зависеть от значения переменной - подробности см. В C446 в F2008.

Компонент n в некоторых объектах типа dataframe является переменной; расчет sum(n) требует его стоимости; вы нарушаете ограничение.

Параметры типа длины, даже если ваш компилятор поддерживает их, могут быть только скалярными.

Как вы заключили - использование выделенного компонента и правильное распределение вещей в какой-либо процедуре построения - это путь.

+0

В начале я был удивлен, что декларация «double precision, dimension (sum (n), d) :: x' работала внутри процедуры, если' n' была переменной 'intent (in)'. Поэтому я был заинтересован, что это может также работать в объявлении типа. До сих пор. –