2010-07-28 9 views
14

en Fortran 95, si se asigna una variable en la declaraciónasignación de Fortran de declaración y SAVE atributo Gotcha

integer :: var = 0 

que es equivalente a

integer, save :: var = 0 

y por lo tanto la variable se conserva después de la ejecución de la rutina (es equivalente a static en C hablar) y no se reinicializa cuando se vuelve a llamar. ¿Cuál es la razón de ser/problema técnico detrás de tal comportamiento (en mi humilde opinión)?

+2

En aras de la exhaustividad, quisiera mencionar que en la norma Fortran 2003 el punto que mencionas está cubierto de C1107: "Si un objeto de un tipo para el que se especifica componente de inicialización (R444) aparece en la especificación partes de un módulo y no tiene el atributo ALLOCATABLE o POINTER, el objeto tendrá el atributo SAVE ". –

+0

@Alexandros Gezerlis - Correcto, pero él pregunta "por qué" hicieron las cosas de esta manera, y ahora que entiendo su pregunta, también tengo la misma pregunta :). – dcp

+0

Lo sé, es por eso que no publiqué esto como una respuesta. –

Respuesta

8

No creo que hay alguna razón de ser de tal comportamiento.

Pero por lo que yo sé, Stefano, se utiliza una terminología equivocada. En su código no hay instrucción de asignación solo la inicialización de variable (var) usando la expresión de inicialización (0).

integer :: var = 0 ! type declaration & initialization 

integer :: var ! type declaration 
var = 0  ! assignment 

Parece que fue solo decisión del comité de diseño. Si tenemos dicha expresión (con el signo de igualdad en el enunciado de declaración de tipo) es la inicialización, no la asignación. Y la inicialización solo tiene lugar una vez durante la ejecución del programa (y no de los procedimientos).

Sin embargo puede haber algunas razones históricas de tal decisión. Eche un vistazo al hilo this.

Hoy en día este tipo de comportamiento es peligroso debido a que muchos otros idiomas ampliamente usados ​​sigue a otro convenciones sobre la inicialización/asignación.

+0

Si esta es una decisión de diseño deliberada, ¿debería publicar una pregunta "¿qué se permite a los miembros del comité Fortran fumar durante las reuniones decisionales?" :) seriamente. No creo que hayan estropeado tanto, por lo que debe haber una razón, tal vez enraizada en la compatibilidad o problemas técnicos. parece demasiado extraño como una decisión de diseño por sí misma. –

+1

@Stefano: también puede haber algunas razones históricas y no fumar. =) Lea este hilo: http://www.rhinocerus.net/forum/lang-fortran/92384-initialization-local-variables.html – Wildcat

+0

¡Creo que acaba de dar en el clavo! Por favor edite su respuesta para incluir el enlace. –

6

Muchos viejos FORTRAN 77 y compiladores anteriores asignan estáticamente todas las variables. Muchos programadores confiaron en este comportamiento: esto técnicamente era un error en sus programas ya que a menos que usaran el calificador "SAVE" en la declaración (o añadieron una declaración SAVE simple a cada procedimiento) el valor de la variable no estaba definido al reingresar a un procedimiento. Pero como en esos días los programas solían estar vinculados a una plataforma y compilador particular durante años, los programadores se salieron con la suya. Este es un "gotcha" muy común en portar el código FORTRAN 77 heredado de un compilador Fortran> = 90 moderno. La mayoría de los compiladores proporcionan conmutadores en tiempo de compilación para restaurar este comportamiento, como la opción fno-automática de gfortran. Lo más probable es que el comité haya visto variables que se inicializaron en su declaración como muy probable que necesiten el atributo SAVE, en mi opinión, una decisión de diseño razonable. Creo que lo que es más diferente de otros lenguajes, y lo más fácil es confundir al programador multilingüe, es que la inicialización se realiza solo una vez.

Cuestiones relacionadas