FORTRAN: Einstellung array auf 0 funktioniert nicht

Tue ich etwas, was ich getan habe, Zeit nach Zeit, die Einstellung, die ein array auf null in Fortran 90. Doch aus irgendeinem Grund ist es in diesem Fall nicht funktioniert, und ich habe keine Ahnung, warum.

Ich zuweisen, das array und die Verwendung A = 0.d0 aber wenn ich Schreibe, aus einer der Komponenten druckt er wie 0,4 xxx

Mein array ist ein Modul-level-array, wenn das einen Unterschied macht, und ich bin initialisieren innerhalb einer subroutine.

Hat jemand eine Idee, warum das passieren kann?

EDIT: Sorry, ich war Weg deshalb noch nicht geantwortet haben. Das ist immer noch geschieht. Ich bin mit gfortran 4.3. Ich habe ein paar Sachen verändert um zu sehen, ob Sie helfen, aber Sie haben es nicht. Beachten Sie unten, dass ich die Elemente auf null zwei Möglichkeiten. Innerhalb der Schleife sind Sie auf jeden Fall wird auf null gesetzt, aber nachdem die Schleife mindestens ein element ist immer null ohne ersichtlichen Grund. Ich weiß, dass alle anderen Elemente nicht null sind, wie gut. Ich habe die array-betroffenen zu einer lokalen subroutine array, aber das hat keine Wirkung. Der folgende code ist der code, gibt mir falsche Ausgabe:

subroutine coeff_cube(f, Ng,x_max_8,coeffs)
  integer, intent(in)   :: Ng
  real(8), intent(in)   :: f(Ng,Ng,Ng)
  real(8), intent(in)   :: x_max_8


  integer               :: i,j,k,ii,jj,kk

  real(8)                :: Ints(Ng,nmax+1)
  real(8), intent(out)  :: coeffs(nmax+1,nmax+1,nmax+1)

  call cube_ints(x_max_8,Ng,Ints)

  write(*,*) "NOW NMAX IS: ", nmax       !Prints '24'
  coeffs = 0.0d0
  do i=1,nmax+1
    do j=1,nmax+1
      do k=1,nmax+1
        coeffs(i,j,k) = 0.d0
        write(*,*) coeffs(i,j,k)  !Prints 0.0000000000000000 for all i,j,k
      end do
    end do
  end do

  write(*,*) coeffs(1,3,28)               !Prints a non-zero number
  coeffs(1,3,28) = 0.0d0
  write(*,*) coeffs(1,3,28)               !Prints 0.0000000000000000

  do k=1,nmax+1
    i=1
    j=1
    if (i+j+k .GT. nmax+1)then
            exit
    end if
    do j=1,nmax+1
        i=1
        if (i+j+k .GT. nmax+1)then
            exit
        end if
      do i=1,nmax+1
        if (i+j+k .GT. nmax+1)then
            exit
        end if
        do kk=1,Ng
          do jj = 1,Ng
            do ii = 1,Ng
                coeffs(i,j,k) = coeffs(i,j,k) + &
                & f(ii,jj,kk)*Ints(ii,i)*Ints(jj,j)*Ints(kk,k)
                if(i==1.AND.j==3.AND.k==28)then
                    if (kk==1) then
                    write(*,*) coeffs(i,j,k)
                    end if
                end if
            end do
          end do
        end do
      end do
    end do
  end do
  write(*,*) coeffs(1,3,28)          !Prints 0.0000000000000000
end subroutine

Hat jemand irgendwelche Ideen?
Danke.

  • Zeigen Sie den code, der die Zuweisung der array.
  • Sind Sie sicher, dass das element, das Sie versuchen zu schreiben, ist eigentlich innerhalb der Grenzen des array, d.h. der index ist nicht zu klein oder zu groß?
  • Mit dieser info können wir nur raten. Wir müssen sehen, mehr code einschließlich Deklarationen. Ist die print-Anweisung Anweisung zeigt den falschen Wert sofort nach der Initialisierung oder später? Wenn später vielleicht haben Sie irrtümlich geschrieben, um den Speicher-Ort, z.B. über einen index-Fehler, die auf einem anderen array. Ich schlage vor, mit wie vielen warning-Optionen Ihres Compilers wie möglich, einschließlich der run-time-index überprüfen. Welchen compiler benutzt du?
  • Wie funktioniert das Unterprogramm den Wert des nmax ?
InformationsquelleAutor StevenMurray | 2012-07-05
Schreibe einen Kommentar