Fortran
Внутренние процедуры
Поиск…
замечания
Многие из доступных внутренних процедур имеют общие типы аргументов. Например:
- логический аргумент
MASK
который выбирает элементы входных массивов для обработки - целочисленный скалярный аргумент
KIND
который определяет вид результата функции - целочисленный аргумент
DIM
для функции сокращения, который управляет размером, над которым выполняется сокращение
Использование PACK для выбора элементов, удовлетворяющих условию
Внутренняя функция pack
объединяет массив в вектор, выбирая элементы на основе заданной маски. Функция имеет две формы
PACK(array, mask)
PACK(array, mask, vector)
(т. е. vector
аргумент необязателен).
В обоих случаях array
- это массив, а также mask
логического типа и соответствующая array
(либо скаляр, либо массив той же формы).
В первом случае результатом является массив ранга 1 типов и типов array
с числом элементов, являющимся числом истинных элементов в маске.
integer, allocatable :: positive_values(:)
integer :: values(5) = [2, -1, 3, -2, 5]
positive_values = PACK(values, values>0)
приводит к positive_values
являющимся массивом [2, 3, 5]
.
При наличии аргумента vector
rank-1 результат теперь представляет собой размер vector
(у которого должно быть как минимум столько элементов, сколько есть истинных значений в mask
.
Эффект с vector
заключается в том, чтобы вернуть этот массив с исходными элементами этого массива, перезаписанными маскированными элементами array
. Например
integer, allocatable :: positive_values(:)
integer :: values(5) = [2, -1, 3, -2, 5]
positive_values = PACK(values, values>0, [10,20,30,40,50])
приводит к positive_values
являющимся массивом [2,3,5,40,50]
.
Следует отметить, что независимо от формы array
аргументов результат всегда является массивом ранга-1.
В дополнение к выбору элементов массива, удовлетворяющих условию маскировки, часто бывает полезно определить индексы, для которых выполняется условие маскировки. Эта общая идиома может быть выражена как
integer, allocatable :: indices(:)
integer i
indices = PACK([(i, i=1,5)], [2, -1, 3, -2, 5]>0)
что приводит к тому, что indices
составляют массив [1,3,5]
.