В настоящее время в моем коде у меня есть 2D-массивМассив производного типа: выберите запись
integer, allocatable :: elements(:,:)
и определить некоторые константы
integer, parameter :: TYP = 1
integer, parameter :: WIDTH = 2
integer, parameter :: HEIGHT = 3
! ...
integer, parameter :: NUM_ENTRIES = 10
и выделить что-то вроде
allocate(elements(NUM_ENTRIES,10000))
так я может получить доступ к элементам, как
write(*,*) elements(WIDTH,100) ! gives the width of the 100th element
Теперь я хотел бы иметь не только целое число, но и смесь типов для каждого элемента. Поэтому я определить производный тип
type Element
logical active
integer type
real width
! etc
end type
и использовать массив элементов
type(Element), allocatable :: elements(:)
с 2d версии массива я мог бы вызвать подпрограмму, говоря это, какую запись использовать. .
subroutine find_average(entry, avg)
integer, intent(in) :: entry
real, intent(out) :: avg
integer i,
real s
s = 0
do i = lbound(elements,1), ubound(elements,1)
if (elements(TYP,i) .gt. 0) s = s + elements(entry,i)
end do
avg = s/(ubound(elements,1)-lbound(elements,1))
end subroutine
Так что я мог call find_average(HEIGHT)
найти среднюю высоту или передать WIDTH
, чтобы получить среднюю ширину. (И мои подпрограммы делают более сложные вещи, чем поиск средней высоты или ширины, это просто пример.)
Вопрос: Как использовать различные типы (как с производным типом), но и повторно использовать мои функции для работы с разными записями (как в подпрограмме примера)?
'entry' всегда будет указывать на запись того же типа (скажем, всегда' real'), поэтому, к счастью, этой проблемы у меня не будет. Но первые два предложения мне не понятны. Для случая с массивом, вы имеете в виду, что я могу дать элементам среза (WIDTH, :) 'функции? Для случая производного типа я не хочу один элемент, мне нужны все элементы. Не могли бы вы добавить модифицированную версию функции моего примера, поэтому я понимаю, что вы имеете в виду? Спасибо –
о редактировании: нет извините, это не то, что я хочу. –
Он передает все элементы данного подпункта определенного пользователем типа. При необходимости Fortran может выбирать различные процедуры в зависимости от типа подэлемента. Как это отличается от того, что вы хотите сделать? –