Estoy escribiendo mi código y usando la función de entrada y salida en Fortran. El código tiene este aspecto ( solo para simplificar ):

PROGRAM TEST

  REAL, DIMENSION(1000):: A
  REAL:: B
  INTEGER::T

 !Defining input and output  
  OPEN(UNIT=1, FILE='input.dat', STATUS='OLD')
  OPEN(UNIT=2, FILE='output.dat', STATUS='NEW')  

 !Reading from file "input.dat"  
  READ(1,*) (A(I),I=1,1000)

 !Just for initial condition
  B=0.0  

  DO T=1, 10
    PRINT *, 'Step =', T 
        DO I=1, 1000     
           B=B+1.0     
           A(I)=A(I)/B  
        END DO
  END DO

 !Writing results into file "output.dat"
   DO I=1, 1000
      WRITE (2,100) I, A(I)
   END DO 
   100 FORMAT (' ',T3, I12, T17, F14.4)   

END PROGRAM TEST

Estaba usando Gfortran 5.3 y el resultado no fue como esperaba. Esperaba obtener el resultado de la variable T en la pantalla (o terminal en el sistema operativo Ubuntu) cuando el programa se está ejecutando y las variables I y A(I) están escritas en el archivo {{X3} }. No tuve problemas con las variables I y A(I), ya que se escribieron correctamente en el archivo output.dat. El problema es con la variable T, donde no apareció en la terminal, pero estaba escrita en el archivo input.dat. Bueno, incluso el archivo anterior en el archivo input.dat no se sobrescribió. ¿Alguien podría darme la sugerencia?

FYI, también probé con otro compilador (usando el sistema operativo Windows), por ejemplo:

  1. Microsoft Fortran Powerstation (el muy antiguo): pero funcionó como esperaba.
  2. MinGW-w64 (versión GCC para Windows): pero no funcionó correctamente.
0
bestrong 23 jul. 2016 a las 21:42

2 respuestas

La mejor respuesta

Es probable que esto se deba a que con su combinación particular de plataforma / compilador / versión del compilador / opciones del compilador, la unidad 1 es la unidad preconectada para la consola.

Su declaración OPEN dirige esa unidad a su archivo de entrada. En consecuencia, las declaraciones PRINT que se dirigen implícitamente a esa unidad dirigen su salida al mismo archivo.

Utilice un número de unidad diferente: la elección de valores superiores a 10 generalmente es segura para unidades preconectadas del compilador. Para mayor seguridad, puede usar una declaración INQUIRE(UNIT=unit_number, EXIST=some_logical_variable) para verificar si una unidad en particular está conectada a un archivo antes de su declaración OPEN, y elija un número de unidad diferente si es así. Idealmente, si está escribiendo a Fortran 2008, puede usar el especificador NEWUNIT.

(No codifique los valores de los números de unidad en sus declaraciones de entrada / salida; siempre deben estar representados por una variable o constante con nombre, de modo que el valor se pueda establecer / cambiar fácilmente en un solo lugar).

5
IanH 23 jul. 2016 a las 22:35

He encontrado las respuestas. En realidad, el código que publiqué arriba funcionará bien en Gfortran 5.3, ya que usé OPEN(UNIT=1,...) y OPEN(UNIT=2,...), que es que no habrá ningún problema ya que estoy usando 1 y {{X3} }. Acabo de escribir este simple caso para representar mi código real sin verificarlo primero. Pero en realidad, en mi código real, utilicé dos declaraciones de que OPEN(UNIT=5,...) y OPEN(UNIT=6,...) existían, que no están permitidas en Fortran, ya que:

  1. UNIT=5 declara Standard In que se usa para leer datos desde el teclado.
  2. UNIT=6 declara Standard Out que se usa para imprimir la salida general en la pantalla.
  3. UNIT=0 declara Standard Error que se usa para imprimir mensajes de error en la pantalla.

No me di cuenta antes, ya que estoy trabajando en un código bastante antiguo, por lo que O necesito reescribirlo en una versión más nueva. Entonces, para evitar los problemas, simplemente no use UNIT=5, UNIT=6 y UNIT=0.

1
bestrong 24 jul. 2016 a las 09:27