2016-05-20 9 views
2

ich jetzt versuche, meine alten Fortran-Code zu aktualisieren, die die Linien wie (*)Ordnen Sie mehrere Variablen auf einmal mit SOURCE =

allocate(a(2), b(2)) 
a(:) = 0.0 
b(:) = 0.0 

Zunächst änderte ich sie

allocate(a(2), source=0.0) 
allocate(b(2), source=0.0) 

beinhaltet aber Das ist eindeutig nicht sehr einfach. Also habe ich versucht, sie zu kombinieren, so dass

allocate(a(2), b(2), source=0.0) !! (1) 

habe ich nicht erwarten, dass es funktioniert, aber es funktionierte tatsächlich für gfortran> = 4,8 und Sun Fortran 8.7 (die zwar nicht für ifort-14). Also ging ich durch den Abschnitt ALLOCATE der F2003 und F2008 Dokumente, und es scheint, dass die Einschränkung in F2008 entfernt wurde, dass "Wenn SOURCE = erscheint, Zuweisung-Liste soll nur eine allocate-Objekt enthalten". Bedeutet dies, dass die obige Zeile 1 in F2008 kein Problem darstellt und dass das unterschiedliche Verhalten einfach auf den unterschiedlichen Grad der F2008-Unterstützung zurückzuführen ist?

(*) In tatsächlichen Codes habe ich versucht, mehrere Array-Komponenten eines abgeleiteten Typs, allocate(conf% crd(3,N), conf% vel(3,N), conf% frc(3,N), blah, blah,...) zuzuweisen, während sie jedem von ihnen Null zuweisen. Ich habe mich gefragt, ob es möglich ist, diese Zeilen etwas zu vereinfachen.

+1

Sehr einfach: ja. Angenommen, "a" und "b" sind typkompatibel mit "0.0". – francescalus

+0

@francescalus OK danke :) Ich fühle, dass dies sehr praktisch ist, wenn viele Compiler unterstützen ... – roygvib

+0

Beachten Sie jedoch: Einige Versionen von ifort implementieren die Syntaxregeln von F2008, aber nicht richtig Sourcing. [Das heißt, der Compiler gibt im Hintergrund nicht das korrekte Ergebnis der zugeteilten Zuordnung aus.] – francescalus

Antwort

2

auf dem hohen Niveau, ja, die Beschränkung in Fortran 2003, dass es nur ein Objekt in einer sourced Zuordnung ist in Fortran 2008

Nun zu anderen Angelegenheiten entfernt. Zuerst zeigen Sie nicht die Deklarationen a und b. In einer Quellzuordnung müssen die zuzuweisenden Objekte typkompatibel zur Quelle sein. Der einfache Fall

real, allocatable, dimension(:) :: a, b 
allocate(a(2), b(2)) 
a(:) = 0.0 
b(:) = 0.0 

hat die gleiche Fortran 2008 Wirkung wie

real, allocatable, dimension(:) :: a, b 
allocate(a(2), b(2), source=0.0) 

Aber was

double precision, allocatable, dimension(:) :: a, b 
allocate(a(2), b(2), source=0.0) 

?

Und der zweite Punkt von vor ist: Fortran 2008 ist eine relativ neue Sache. Ich traue nicht allen Compilern zu, die Regeln mit mehreren Objekten in einer zugeteilten Zuordnung korrekt zu implementieren.

+0

Ja, mein Testcode ist genau wie "real, allocatable ::", also kompatibel mit 0.0 (single-precision real). Aber funktioniert es auch mit "double precision, allocatable ::" nicht korrekt, weil 0.0 genau mit einfacher Genauigkeit darstellbar ist ...? Oder ist es eigentlich gefährlich wegen bitweisem Kopieren? – roygvib

+0

Es ist, dass eine doppelte Genauigkeit nicht typkompatibel mit einem Standard-Real ist. Das ist die zweite zugeteilte Zuteilung ist nicht erlaubt, nicht, dass es eine andere Wirkung hat. – francescalus

+0

Ich habe versucht, in der Deklaration von 'a'und' b' 'echte' zu' doppelte Genauigkeit' zu ersetzen, während 'source = 0.0' verwendet wird. Dann beklagten sich gfortran und ifort tatsächlich darüber, dass die Art zwischen den Variablen und dem Quellenausdruck identisch sein sollte, während interessanterweise Sun fortran die Verwendung von gemischten Arten zuließ (was eine Compiler-Erweiterung sein könnte). Insgesamt sieht es sicherer aus, sie von der gleichen Art zu halten. Danke :) – roygvib

Verwandte Themen