fortran gfortran fortran2003

Fortran derivación tipo de asignación



gfortran fortran2003 (2)

Digamos que tengo un tipo derivado Fortran

type :: atype integer :: n integer :: a(10) integer, allocatable :: b(:) end type

y tengo dos instancias de este tipo

type(atype) :: t1, t2

¿Qué sucede exactamente cuando hago la siguiente tarea?

t2 = t1

Me interesa esto porque me gustaría hacer correctamente copias de las variables de tipo derivadas, es decir, los componentes escalares deben ser iguales, cada elemento de los componentes de la matriz debe ser igual y las matrices asignables deben tener el mismo tamaño asignado y los elementos deben ser iguales. Por el momento, solo escribiría una subrutina que copie y asigne los componentes correctamente.

subroutine copy_atype(from, to) type(atype) :: from, to to%n = from%n to%a = from%a if (allocated(to%b)) deallocate(to%b) if (allocated(from%b) then allocate(to%b(size(from%b))) to%b = from%b end if end subroutine

Agradecería las instrucciones para las secciones apropiadas en los estándares.

Estoy usando gfortran 4.7.


En ausencia de un procedimiento de asignación definido adecuado que sea accesible para la asignación de un atype a otro, ocurre una asignación de tipo derivada intrínseca. Esto se describe en F2008 7.2.1.3. Para su definición de tipo, la asignación de tipo derivado intrínseca básicamente hace lo que hace su procedimiento:

  • Los componentes no asignables (que no tienen por sí mismos asignaciones definidas vinculadas a tipos) se asignan a través de la asignación intrínseca. Si tienen asignaciones obligatorias de tipo, eso se usa.

  • Los componentes asignados en el objeto asignado se desasignan si ya están asignados, reasignados con el mismo tipo, tipo de parámetros y límites de la expresión que se está asignando, y luego escriba la asignación definida vinculada (si corresponde) o la asignación intrínseca se usa para transferir el valor.

También:

  • los componentes del puntero son punteros asignados;

  • Los componentes de CoArray deben coincidir en el estado de asignación entre la variable y la expresión, y se transfieren utilizando la asignación intrínseca.


Esto es muy similar a una pregunta hecha hace unos días: Tipo derivado anidado con asignación sobrecargada . Vea la respuesta aceptada allí para una explicación detallada.

Puede usar subrutina copy_atype directamente para formar un operador de assignment :

type :: atype integer :: n integer :: a(10) integer, allocatable :: b(:) contains procedure :: copy_atype generic :: assignment(=) => copy_atype end type

De esta forma, puede asignar directamente valores del mismo tipo a una variable de tipo atype . Incluso podría extender la asignación a otros tipos de variables al proporcionar una lista separada por comas de las subrutinas apropiadas.