2010-07-28 4 views
14

in Fortran 95, wenn Sie eine Variable bei der Deklaration zuweisenFortran Zuordnung auf Erklärung und SAVE-Attribut gotcha

integer :: var = 0 

es

integer, save :: var = 0 

äquivalent ist, und die Variable daher nach Routineausführung erhalten ist (entspricht static in C speak) und wird beim erneuten Aufruf nicht neu initialisiert. Was ist das Grundprinzip/technische Problem hinter einem solchen (IMHO gefährlichen) Verhalten?

+2

Der Vollständigkeit halber sei erwähnt, dass in der Norm Fortran 2003 der von Ihnen erwähnte Punkt in C1107 behandelt wird: "Wenn im Spezifikationsteil ein Objekt eines Typs angegeben ist, für den die Komponenteninitialisierung (R444) angegeben ist eines Moduls und nicht über das Attribut ALLOCATABLE oder POINTER verfügt das Objekt über das Attribut SAVE. ". –

+0

@Alexandros Gezerlis - Richtig, aber er fragt "Warum" haben sie die Dinge so gemacht, und jetzt, da ich seine Frage verstehe, habe ich auch die gleiche Frage :). – dcp

+0

Ich weiß, deshalb habe ich das nicht als Antwort gepostet. –

Antwort

8

Ich glaube nicht, dass hinter einem solchen Verhalten ein Grundprinzip steht.

Aber so weit ich weiß, Stefano, Sie haben falsche Terminologie verwendet. In Ihrem Code gibt es keine Zuweisungsanweisung nur Variablen (var) Initialisierung mit Initialisierungsausdruck (0).

So scheint es, dass es nur Ausschussentwurfsentscheidung war. Wenn wir einen solchen Ausdruck haben (mit Gleichheitszeichen in der Deklarationsanweisung), ist die Initialisierung keine Zuweisung. Die Initialisierung findet während der Ausführung des Programms (und nicht der Prozeduren) nur einmal statt.

Allerdings könnte es einige historische Gründe für eine solche Entscheidung geben. Werfen Sie einen Blick auf this Thread.

Heute ist ein solches Verhalten gefährlich, weil viele andere weit verbreitete Sprachen anderen Konventionen zur Initialisierung/Zuweisung folgen.

+0

Wenn dies eine bewusste Designentscheidung ist, sollte ich vielleicht eine Frage stellen: "Was dürfen Mitglieder des Fortran Komitees während der Entscheidungstreffen rauchen?" :) Ernsthaft. Ich glaube nicht, dass sie so viel vermasselt haben, also muss es einen Grund geben, der vielleicht in Kompatibilität oder technischen Fragen begründet ist. es erscheint mir zu komisch, eine Designentscheidung um ihrer selbst willen zu sein. –

+1

@Stefano: auch da könnte es einige historische Gründe geben und nicht rauchen. =) Lies diesen Thread: http://www.rhinocerus.net/forum/lang-fortran/92384-initialization-local-variables.html – Wildcat

+0

Ich denke, du bist einfach auf den Punkt gekommen! Bitte bearbeiten Sie Ihre Antwort, um den Link hinzuzufügen. –

6

Viele alte Compiler FORTRAN 77 und früher haben alle Variablen statisch zugewiesen. Viele Programmierer stützten sich auf dieses Verhalten - dies war technisch gesehen ein Fehler in ihren Programmen, da der Wert der Variablen bei einem erneuten Eintritt in a nicht definiert war, es sei denn, sie verwendeten das "SAVE" -Kennzeichen in der Deklaration (oder fügten jeder Prozedur eine einfache SAVE-Anweisung hinzu) Verfahren. Aber da Programme damals oft an eine bestimmte Plattform und einen Compiler gebunden waren, kamen Programmierer damit durch. Dies ist ein sehr häufiges "GOTCHA" bei der Portierung von Legacy-Code FORTRAN 77 auf einen modernen Fortran> = 90 Compiler. Die meisten Compiler bieten Switches zur Kompilierungszeit, um dieses Verhalten wiederherzustellen, z. B. die fno-automatische Option gfortran. Sehr wahrscheinlich hat das Komitee gesehen, dass Variablen, die in ihrer Deklaration initialisiert wurden, sehr wahrscheinlich das SAVE-Attribut benötigen - meiner Meinung nach eine vernünftige Entwurfsentscheidung. Ich denke, was unterscheidet sich am meisten von anderen Sprachen, und am einfachsten, den mehrsprachigen Programmierer zu verwirren, ist, dass die Initialisierung nur einmal durchgeführt wird.