Перегрузка связанной с типом функции в Fortran 2003 - PullRequest
8 голосов
/ 12 марта 2012

У меня есть производный от Фортрана тип T, который содержит массивы данных (многих) разных рангов и типов. Эти массивы скрыты внутри сложной структуры данных, и я хотел бы иметь функцию получения, которая выполняет следующие действия:

a => T%get(data_id)

где «a» - указатель массива заданного типа, а data_id - целое число, которое используется для поиска данных внутри структуры данных. Я делаю это путем перегрузки многих функций get_thistype () под общим именем.

TYPE T
   PROCEDURE :: get_real
   PROCEDURE :: get_integer
   GENERIC   :: get => get_real,get_integer
END TYPE

Это работает, если подпрограммы get_thistype () являются подпрограммами, но не если они написаны как функции. Это означает, что мой код выглядит так:

CALL T%get(a,data_id)

, который я считаю гораздо менее читабельным. Есть ли способ перегрузить функции, которые имеют одинаковый список аргументов, но разные типы возвращаемых данных? или я должен использовать подпрограммы для этого?

Ответы [ 2 ]

8 голосов
/ 13 марта 2012

Когда оператор присваивания (указатель) выполняется в фортране, правая часть всегда полностью оценивается перед выполнением присваивания. Это происходит независимо от левой стороны, поэтому LHS не может повлиять на результат оценки RHS. Это просто способ, которым разработан язык.

3 голосов
/ 25 июля 2014

Я только что наткнулся на этот пост, поэтому в интересах любого, кто увидит это в будущем:

Если я правильно понимаю вопрос, вы можете сделать это, перегрузив оператор присваивания.Пример:

файл X.f90:

MODULE XModule

TYPE :: X
   INTEGER, DIMENSION(:), POINTER :: IntArray
   REAL,    DIMENSION(:), POINTER :: RealArray
END TYPE

INTERFACE ASSIGNMENT (=)
   MODULE PROCEDURE PointToInt
   MODULE PROCEDURE PointToReal
END INTERFACE

CONTAINS

SUBROUTINE PointToInt(Ip, V)
   INTEGER, POINTER, DIMENSION(:), INTENT(OUT) :: Ip
   TYPE(X), INTENT(IN) :: V
   Ip => V%IntArray
END SUBROUTINE PointToInt

SUBROUTINE PointToReal(Rp, V)
   REAL, POINTER, DIMENSION(:), INTENT(OUT) :: Rp
   TYPE(X), INTENT(IN) :: V
   Rp => V%RealArray
END SUBROUTINE PointToReal

END MODULE

тестовый файл драйвера Driver.f90:

PROGRAM Driver
USE XModule
TYPE(X) :: Var
INTEGER, DIMENSION(:), POINTER :: I
REAL, DIMENSION(:), POINTER :: R

ALLOCATE(Var%IntArray(2))
ALLOCATE(Var%RealArray(3))

Var%IntArray = [1, 2]
Var%RealArray = [1., 2., 3.]

I = Var
PRINT*, I

R = Var
PRINT*, R

END PROGRAM

Вывод:

           1           2
   1.000000       2.000000       3.000000    

Hopeэто помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...