Tipos de datos definidos por el usuario
De LIDSOL
En ocaciones, es necesario el uso de tipos de datos definidos por el usuario, para crear unidades de programa más complejas, como lo son las estructuras de datos (listas, graphos, etc); que nativamente el lenguaje no implementa, por lo que existe una forma de definir datos compuestos.
Como se mencionó al principio, los tipos de datos nativos son aquellos que interpreta directamente el lenguaje. En el caso de Fostran 90, los tipos de datos nativos son: character, integer, real, double, complex. etc.
Pero si se requiere algún tipo de dato que contenga dos o más tipos nativos, para describir algún elemento necesario para la solución de un problema, entonces se puede recurir a una sentencia pensada para la definición de nuevos datos:
TYPE <nombre-tipo> tipos de datos nativos END TYPE <nombre-tipo>
Donde <nombre-tipo> es el nombre con el que se describe el tipo de dato compuesto, y que se recomienda sea tan descriptivo como sea posible.
Como se observa, entre TYPE y END TYPE se encierran los elementos que componen a nuestro nuevo tipo de dato, y que son elementos conocidos por el lenguaje.
Por ejemplos, si se deseara definir un tipo de dato que represente números complejos, se puede construir de la siguiente manera:
TYPE num_complejo REAL:: p_real REAL:: p_img END TYPE num_complejo
Y para utilizarlo, es de la siguiente manera:
PROGRAM op_num_cpx
IMPLICIT NONE
TYPE num_complejo
REAL:: pte_real !! Parte real
REAL:: pte_img !! Parte imaginaria
END TYPE num_complejo
TYPE(num_complejo) :: cualquiera, conjugado
PRINT*,'Escribir parte real: '
READ*,cualquiera%pte_real
PRINT*,'Escribe parte imaginaria'
READ*,cualquiera%pte_img
PRINT*,'Este es el numero',cualquiera%pte_real,' + i', cualquiera%pte_img
PRINT*,'Y su conjugado'
conjugado%pte_real=cualquiera%pte_real
conjugado%pte_img= (-1) * cualquiera%pte_img
PRINT*,'Este es el numero',conjugado%pte_real,' + i', conjugado%pte_img
END PROGRAM
En el programa se define un tipo de dato derivado, que en este caso es num_complejo, se declaran dos variables del tipo num_complejo, llamadas cualquiera y conjugado, que después se utilizan.
Como se puede observar, para accesar a algún miembro del dato compuesto, se antepone el nombre de la variable, segido del caracter % seguido del nombre del miembro que se quiere accesar, en este caso para accesar a la parte imaginaria de la variable conjugado, es:
conjugado%pte_img
Tipos derivados compuestos por punteros
La estructura es la misma, con la diferencia que los elementos que conforman al tipo derivado de datos son punteros.
Por ejemplo, si se requiere tener un conjunto de vectores de diferente tipo, que representen a algún ente, se puede crear de la siguiente manera.
TYPE ente_num REAL, DIMENSION(:), POINTER :: a INTEGER, DIMENSION(:), POINTER :: b END TYPE ente_num
Y para usarlo, hay que asignarle memoria a los elementos que conforman al tipo derivado.
Suponiendo que se define una variable llamada un_ente_numerico
TYPE(ente_num)::un_ente_numerico
a éste se le ha de asignar memoria a cada elemento antes de poder usarlo:
ALLOCATE(un_ente_numerico%a(30)) ALLOCATE(un_ente_numerico%b(15))
es decir, ahora se tiene una variable compuesta por dos vectores, uno de longitud 30 de valores reales, y otro de 15 conformado por elementos enteros.
