Как это сделать?
На самом деле на этот вопрос есть довольно прямой ответ: параметризованный производный тип .
@HighPerformanceMark прав, говоря, что сегодня (2019 г.), несмотря на то, что эта функция была представлена в стандарте 16 лет назад, она почти не применялась компиляторами в последнее время.
Хотя, и на самом деле это причина, по которой ярешил написать этот ответ, несмотря на некоторые существующие вопросы по этому вопросу, я хочу оставить в стороне полемику вокруг этой функции и представить резкое, окончательное предложение: USE IT .
Есть по крайней мере 5 основных компиляторов, которые реализовали эту функцию сегодня (Cray, GNU, IBM, Intel, PGI).У большинства из них все еще есть ошибки, но они нуждаются в для использования и, следовательно, тестирования.Затем, когда / если вы обнаружите ошибку, сообщите об этом продавцу.Только так эта функция сломает созданную над ней стигму и станет популярной.
Я знаю, что у всех нас есть серьезный бизнес, и у нас нет времени тратить на "необычные новые непроверенные"вещи "и хотят проверенные, эффективные, математически разумные решенияВот почему мы выбрали Фортран, в конце концов.Я бы не рекомендовал это для этих людей (нас) несколько лет назад, но теперь большинство реализаций достигли уровня юзабилити, который стоит ставки, и использование - единственный способ урезать острые углы.
Параметризованные производные типы интуитивно переводят реальную проблему, которую вы описали.Он обеспечивает автоматический (и элегантный) способ моделирования области типа с одновременным учетом математических и программных аспектов.Правильный синтаксис вашей программы:
module def
type vector(long)
integer, len :: long
real, dimension(long) :: vec
end type vector
end module def
program main
use def
implicit none
type(vector(2)) :: y
y%vec = [1.0, 2.0]
print*, y
end program main
Вы можете найти больше информации об этом здесь , а также по всему Интернету или в вашем любимом Modern Fortran книга.