1XHYDV FDUDFWHUtVWLFDV GH HQWUDGDVDOLGD +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Contenidos del Curso 1.- Introducción 2.- Código fuente, tipos y estructuras de control 3.- Procedimientos y Módulos 4.- Proceso de vectores 5.- Punteros 1XHYDVFDUDFWHUtVWLFDVGHHQWUDGDVDOLGD 7.- Procedimientos intrínsecos 8.- Características redundantes 9.- Desarrollos futuros +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ (QWUDGD6DOLGD ËQGLFH m m m m m m m 6.1 6.2 6.3 6.4 6.5 6.6 6.7 - Introducción Entrada/ Salida (E/ S) sin avance Consultar lista de E/S (INQUIRE) NAMELIST Nuevos descriptores de edición Nuevos especificadores de sentencias Ejercicios +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Introducción m m Las sentencias de entrada/salida (E/S) en Fortran90 son respectivamente UHDG y ZULWH Cada una de ellas puede adoptar 3 formas diferentes: read <ch_var>, <lista_de_entrada> read <etiqueta>, <lista_de_entrada> read *, <lista_de_entrada> print <ch_var>, <lista_de_entrada> print <etiqueta>, <lista_de_entrada> print *, <lista_de_entrada> m m m < ch_var> es una constante de caracteres, una variable de tipo character o un vector de caracteres < etiqueta> es la etiqueta de una sentencia en el código Las listas corresponden a las variables que se desea leer o escribir +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Introducción m La primera forma de sentencia de E/ S se denomina de formato empotrado porque el formato en sí mismo forma parte de la sentencia: print ‘(<lista_de_descriptores>)’, <lista_salida> m En la segunda variante, la etiqueta corresponderá con una sentencia format, que contiene el formato que se desea en la operación de E/ S m La tercera forma es la que se conoce como E/S dirigida por lista. Se trata de la forma más simple y la que más hemos utilizado a lo largo del curso. En esta forma el asterisco indica que se desea un formato de entada o salida acorde con el tipo de los valores a leer/ escribir +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Formateadores de E/S Iw Fw .d Ew .d Aw A Lw nX Tc TLn TRn “ c1 c2 ...cn ” ‘c1 c2 ...cn ’ Escribe un ent ero en los siguientes w caracteres I m prim e un núm ero real en los siguient es w caracteres utilizando d posiciones decim ales I m prim e un núm ero real en los siguient es w caracteres utilizando un form ato de exponente con d posiciones decim ales y 4 dígit os para el exponente Escribe una cadena de caract eres en los siguient es w caracteres Escribe una cadena de caract eres com enzando en la siguiente posición I m prim e L-1 espacios en blanco seguidos por T o F para indicar un valor lógico I gnora las siguientes n posiciones I m prim e el siguiente elem ento com enzando en el caráct er c I m prim e el siguiente elem ento com enzando n posiciones antes (TL) O después (TR) de la posición actual I m prim e la cadena de caract eres c1 c2 ...cn com enzando en la siguiente posición I m prim e la cadena de caract eres c1 c2 ...cn com enzando en la siguiente posición +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ E/S sin avance m m En Fortran 77, cualquier sentencia read o write involucra a registros completos. Hay ocasiones en que resulta conveniente leer/ escribir sólo parte de un registro, y leer/ escribir el resto más tarde. En F90 esta capacidad la proporciona la E/ S sin avance La E/ S sin avance elimina la necesidad de que los registros sean leídos como un todo y de que la longitud de los registros sea conocida de antemano. Se especifica mediante advance='NO’ En la sentencia read o write e inhibe el avance automático hasta el siguiente registro al ejecutar la sentencia. Si se especifica advance=’YES’ m O no se ha especificado nada, entonces se utiliza la forma normal (con avance) de E/S +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ E/S sin avance m Se puede especificar E/ S con y sin avance en el mismo registro o fichero. Una aplicación común de esta posibilidad es escribir una pregunta en pantalla sin usar avance, y leer la siguiente posición en la pantalla. Por ejemplo: write(*, '("Tamaño? ")', advance='NO') read(*, '(I5)') size m A veces es útil determinar cuantos caracteres han sido leídos en una entrada sin avance. Esto se puede conseguir utilizando el especificador size (en la sentencia read), que tiene la forma: size=character_count m Al finalizar la lectura sin avance, a la variable entera character_count se le asigna el número de caracteres leídos, excluyendo caracteres de relleno +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ E/S sin avance m Se puede detectar si una lectura sin avance lee más allá del final de un registro utilizando el especificador IOSTAT, que tiene la forma: IOSTAT=io_status m Al finalizar una sentencia read, a io_status se le asigna un valor que indica si se ha alcanzado un fin de fichero o fin de registro. m Es necesario estudiar la documentación del compilador que se utilice para comprobar el valor de IOSTAT devuelto en estas situaciones +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Consulta de la lista de E/S m Se utiliza para determinar la longitud de una lista de elementos de salida sin formato. La forma es: INQUIRE(IOLENGTH=length) output-list m La longitud puede usarse como valor para el especificador RECL en una operación open subsiguiente. Por ejemplo: integer :: rec_len ... INQUIRE(IOLENGTH=rec_len) name, title, & age, address, tel ... open(unit=1,file=’TEST’,RECL=rec_len, & FORM=’UNFORMATTED’) ... write(1) name, title, age, address, tel ... +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ NAMELIST m NAMELIST da la capacidad de agrupar juntas un conjunto de variables para simplificar la E/ S. NAMELIST es una sentencia de especificación y ha de aparecer antes que las sentencias ejecutables. La forma general es: NAMELIST/namelist-group-name/variablelist m Se trata de de una característica del lenguaje que debería evitarse siempre que sea posible m En sentencias read o write el nombre de lista debe especificarse con el especificador NML o puede sustituir al especificador de formato. No se necesitan listas de E/ S. +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ NAMELIST m Un registro de E/S para un grupo NAMELIST tiene un formato específico: &namelist-group-name var1=x, var2=y, var3=z m m Es posible omitir elementos cuando se está introduciendo datos y esos elementos no cambian. Tampoco hay que introducir los elementos en el orden especificado por la sentencia NAMELIST El siguiente ejemplo muestra el grupo llamado clothes: integer :: size=2 character (len=4) :: colour(3) = & (/’ red’,’pink’,’blue’/) NAMELIST /clothes/ size, colour write(*, NML = clothes) La salida sería: &CLOTHES size = 2, COLOUR = +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ redpinkblue/ )RUWUDQ Descriptores de edición m m Los descriptores de edición especifican exactamente cómo se convertirán en cadenas de caracteres los valores en un dispositivo de salida o fichero interno o cómo se convierten en cadenas de caracteres en un dispositivo de entrada o fichero interno Fortran90 posee los siguientes descriptores de edición nuevos con respecto a F77: (1 (Engineering - ingeniería). Análogo a E pero con exponentes divisibles por 3 (6 (Scientific). Análogo a E pero con el valor antes del punto decimal en [ 1, 10] % Binario 2 Octal = Hexadecimal * Descriptor Generalizado aplicable a todos los tipos intrínsecos +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Descriptores de edición m El siguiente ejemplo muestra la diferencia entre los descriptores de edición E, EN, ES y G program e_en_es_g_compare implicit none real, dimension(4) :: & x=(/1.234, -0.5, 0.00678, 98765.4/) print ’(4E14.3/4EN14.3/4ES14.3/4G14.3)’,& x, x, x, x end program e_en_es_g_compare m La salida sería: 0.123E+01 -0.500E+00 0.678E-02 0.988E+05 1.234E+00 -500.000E-03 6.780E-03 98.765E+03 1.234E+00 -5.000E-01 6.780E-03 9.877E+04 1.23 -0.500 0.678E-02 0.988E+05 +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Nuevos especificadores de sentencias m Las sentencias INQUIRE, open, read y write no son nuevas, pero se han añadido unos cuantos especificadores nuevos: m INQUIRE POSITION=ASIS, REWIND, APPEND o UNDEFINED Indica la posición en el fichero tal como se especificó en la sentencia open ACTION=read, write, READWRITE o UNDEFINED DELIM=APOSTROPHE, QUOTE, NONE o UNDEFINED Indica el carácter utilizado para delimitar constantes de caracteres con E/S dirigida por listas o por NAMELIST. Por defecto es NONE (ninguna) PAD=YES o NO ‘YES’ signfica que el registro de entrada ha de rellenarse con blancos. El defecto es PAD=‘YES’ READWRITE=YES, NO o UNKNOWN Indica si para un fichero está permitido o no leer y escribir o no está determinado +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Nuevos especificadores de sentencias m INQUIRE read=YES, NO o UNKNOWN Indica si para un fichero está permitido o no leer o no está determinado write=YES, NO o UNKNOWN Indica si para un fichero está permitido o no escribir o no está determinado m open Los especificadores POSITION, ACTION, DELIM y PAD tienen los mismos valores y significados que con INQUIRE. Hay un valor adicional: STATUS=REPLACE Si el fichero a abrir no existe, se crea, y si existe se borra y se crea uno nuevo +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ Nuevos especificadores de sentencias m read/ write NML=namelist_name Se utiliza en lugar del especificador de formato cuando se usa un grupo NAMELIST advance=YES o NO m read EOR=label Transfiere el control a la sentencia etiquetada cuando ocurre una condición de fin de registro size=character_count +HUUDPLHQWDV\/HQJXDMHVGH3URJUDPDFLyQ )RUWUDQ