В настоящее время в моем коде у меня есть 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
, чтобы получить среднюю ширину.
(А мои подпрограммы делают более сложные вещи, чем нахождение средней высоты или ширины, это всего лишь пример.)
Вопрос: Как я могу использовать разные типы (как с производным типом), но также повторно использовать свои функции для работы с разными записями (как в подпрограмме примера)?