2010-07-28 11 views
14

in Fortran 95, se si assegna una variabile a dichiarazioneassegnazione Fortran sulla dichiarazione e SAVE attributo Gotcha

integer :: var = 0 

è equivalente a

integer, save :: var = 0 

e la variabile viene quindi mantenuta dopo l'esecuzione di routine (è equivalente a static in C speak) e non viene reinizializzato quando chiamato di nuovo. Qual è la logica/la questione tecnica alla base di tale comportamento (IMHO pericoloso)?

+2

Per completezza, vorrei menzionare che nello standard Fortran 2003 il punto menzionato è trattato in C1107: "Se un oggetto di un tipo per cui è specificata l'inizializzazione del componente (R444) viene visualizzato nella parte delle specifiche di un modulo e non ha l'attributo ALLOCATABLE o POINTER, l'oggetto deve avere l'attributo SAVE. ". –

+0

@Alexandros Gezerlis - Giusto, ma sta chiedendo "perché" hanno fatto le cose in questo modo, e ora che capisco la sua domanda, ho anche la stessa domanda :). – dcp

+0

Lo so, è per questo che non ho postato questo come risposta. –

risposta

8

Non penso che ci sia qualche logica dietro questo comportamento.

Ma per quanto ne so, Stefano, hai usato la terminologia sbagliata. Nel codice non è presente alcuna istruzione di assegnazione inizializzazione solo variabile (var) utilizzando l'espressione di inizializzazione (0).

integer :: var = 0 ! type declaration & initialization 

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

così sembra che era solo comitato decisione di progettazione. Se abbiamo un'espressione di questo tipo (con il segno di uguaglianza nell'istruzione di dichiarazione del tipo) non è l'inizializzazione dell'assegnazione. E l'inizializzazione avviene solo una volta durante l'esecuzione del programma (e non delle procedure).

Tuttavia potrebbero esserci alcune ragioni storiche per tale decisione. Dai un'occhiata al thread this.

Oggi un simile comportamento è pericoloso perché molte altre lingue ampiamente utilizzate seguono altre convenzioni sull'inizializzazione/assegnazione.

+0

Se questa è una decisione deliberata sul design, dovrei forse pubblicare una domanda "quali sono i membri del comitato Fortran autorizzati a fumare durante le riunioni decisionali?" :) sul serio. Non credo che abbiano sbagliato così tanto, quindi ci deve essere una ragione, forse radicata nella compatibilità o problemi tecnici. sembra troppo strano essere una decisione di design fine a se stessa. –

+1

@Stefano: anche ci potrebbero essere alcuni motivi storici e non fumare. =) Leggi questa discussione: http://www.rhinocerus.net/forum/lang-fortran/92384-initialization-local-variables.html – Wildcat

+0

Penso che tu abbia appena azzeccato il colpo! Si prega di modificare la risposta per includere il link. –

6

Molti vecchi compilatori FORTRAN 77 e precedenti allocavano staticamente tutte le variabili. Molti programmatori facevano affidamento su questo comportamento - questo era tecnicamente un bug nei loro programmi poiché a meno che non usassero il qualificatore "SAVE" nella dichiarazione (o aggiungessero una semplice istruzione SAVE ad ogni procedura) il valore della variabile era indefinito al rientro in un procedura. Ma dato che a quei tempi i programmi tendevano ad essere legati a una particolare piattaforma e compilatore per anni, i programmatori se la cavavano. Questo è un "trucco" molto comune nel porting del codice FORTRAN 77 legacy a un moderno Fortran> = 90 compilatori. La maggior parte dei compilatori fornisce switch in fase di compilazione per ripristinare questo comportamento, come l'opzione fno-automatic di gfortran. Molto probabilmente la commissione ha visto le variabili che sono state inizializzate nella loro dichiarazione in quanto molto probabilmente hanno bisogno dell'attributo SAVE - a mio avviso, una decisione progettuale ragionevole. Penso che ciò che è più diverso dalle altre lingue, e più facile da confondere il programmatore multilingue, è che l'inizializzazione viene eseguita solo una volta.

Problemi correlati