Nuevas caractertsticas de entrada/salida

Anuncio
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
Descargar