2016-04-20 1 views
1

Ich versuche den folgenden Code, der einfach zwei Array-Konstruktoren hinzufügt, um ein eindimensionales Array zu erhalten. Abhängig davon, ob one in diesen Ausdrücken verwendet wird (außerhalb der impliziten DO-Schleife), erhalte ich falsche Ergebnisse mit gfortran-5.3 für (1), (3) und (6). Auf der anderen Seite geben ifort-14.0 und Sun fortran 8.7 in allen Fällen korrekte Ergebnisse. Seltsamerweise, wenn ich einen ähnlichen, aber komplizierteren Ausdruck versuche, beginnt sich sogar Sun fortran seltsam zu verhalten (d. H. Es wird während der Kompilierung eingefroren ...). Ich frage mich also, ob ich eine falsche oder gefährliche Syntax in diesen Ausdrücken verwende. Irgendeine Idee...? (Übrigens, wenn ich nur einen Konstruktor zwischen den beiden verlassen, arbeiten sie immer wie erwartet.)Seltsame Ergebnisse durch Hinzufügung von zwei Array-Konstruktoren

program main 
    implicit none 
    integer :: k 
    integer, dimension(2), parameter :: zero = [0,0], one = [1,1] 
    integer, parameter :: N = 1 

    print *, [ one, (zero, k=1,N) ] + [ (zero, k=1,N), one ] !! (1) 
    print *, [ [1, 1], (zero, k=1,N) ] + [ (zero, k=1,N), [1, 1] ] !! (2) 
    print *, [ one, ([0, 0],k=1,N) ] + [ ([0, 0],k=1,N), one ] !! (3) 
    print *, [ [1, 1], ([0, 0],k=1,N) ] + [ ([0, 0],k=1,N), [1, 1] ] !! (4) 
    print *, [ 1, 1, (0, 0, k=1,N) ] + [ (0, 0, k=1,N), 1, 1 ] !! (5) 
    print *, [ one, (0, 0, k=1,N) ] + [ (0, 0, k=1,N), one ] !! (6) 

    print *, [ (one, k=1,1), (zero, k=1,N) ] + [ (zero, k=1,N), (one, k=1,1) ] !! (7) 
endprogram 

Ergebnisse mit ifort14.0 und Sun Fortran 8.7:

 1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 

Ergebnisse mit gfortran-5.3:

 1   1   0   1 
     1   1   1   1 
     1   1   0   1 
     1   1   1   1 
     1   1   1   1 
     1   1   0   1 
     1   1   1   1 
+0

Wer mir gut aussehen. – francescalus

+0

@francescalus OK, vielen Dank! – roygvib

Antwort

1

die Ergebnisse werden erwartet, wenn die assoziiertes Verwendung konstruieren

program main 

     use, intrinsic :: iso_fortran_env, only: & 
      compiler_version, & 
      compiler_options 

     implicit none 
     integer :: k 
     !integer, dimension(2), parameter :: zero = [0,0], one = [1,1] 
     integer, parameter :: N = 1 

     associate(zero => [0,0], one => [1,1]) 
      print *, [ one, (zero, k=1,N) ] + [ (zero, k=1,N), one ] !! (1) 
      print *, [ [1, 1], (zero, k=1,N) ] + [ (zero, k=1,N), [1, 1] ] !! (2) 
      print *, [ one, ([0, 0],k=1,N) ] + [ ([0, 0],k=1,N), one ] !! (3) 
      print *, [ [1, 1], ([0, 0],k=1,N) ] + [ ([0, 0],k=1,N), [1, 1] ] !! (4) 
      print *, [ 1, 1, (0, 0, k=1,N) ] + [ (0, 0, k=1,N), 1, 1 ] !! (5) 
      print *, [ one, (0, 0, k=1,N) ] + [ (0, 0, k=1,N), one ] !! (6) 
      print *, [ (one, k=1,1), (zero, k=1,N) ] + [ (zero, k=1,N), (one, k=1,1) ] !! (7) 
     end associate 

     print *, 'This result was compiled by ', & 
      compiler_version(), ' using the options ', & 
      compiler_options() 

    end program 

Benutzung von GNU Fortran (Debian 5.3.1-14) 5.3.1 20.160.409 ich

 1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 
     1   1   1   1 

     This result was compiled by GCC version 5.3.1 20160409 using the options -mtune=generic -march=x86-64 -O3 -Wall -std=f2008ts 
+1

Das Entfernen des ** Parameter ** -Attributs führt ebenfalls zu den erwarteten Ergebnissen. – jlokimlin

+0

Ich sehe ... Ich habe versucht, den "Parameter" zu entfernen, und es gibt das erwartete Ergebnis auch auf meinem Computer (CentOS + gfort4.8 oder 5). Der Täter scheint also das Parameterattribut zu sein ... – roygvib