Создать пользовательский тип, который зависит от одного из его элементов - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь определить пользовательский тип, который зависит от одного из его элементов.Это тестовый код, который обобщает то, как я пытался;

module def
  type vector
    integer, parameter :: long
    real,dimension(1:long) :: vec
  end type vector
end module def

program main
  use def
  implicit none

  type(vector) :: y
  y%long = 2
  y%vec = (/1.0d0, 2.0d0/)

  print*, y

end program main

Но кажется, что это невозможно сделать таким образом, потому что, когда я компилирую его в gfortran, у меня возникает следующая ошибка:

integer, parameter :: long
                  1
Error: Attribute at (1) is not allowed in a TYPE definition
testmodule.f03:4:17:

Как это сделать?

1 Ответ

0 голосов
/ 28 февраля 2019

Как это сделать?

На самом деле на этот вопрос есть довольно прямой ответ: параметризованный производный тип .

@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 книга.

...