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
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sorry, ich habe es herausgefunden...
Tut es in der Tat auf das array auf null, aber für einige Grund, warum ich Schreibe, ein element, das nicht in der Reihe (out of bounds). Ich hätte erwartet, dass es mir ein Fehler, anstatt zu schreiben, die jede alte Sache, aber ich denke, das ist nur fortran...
Sind Sie sich bewusst, dass Sie initialisieren kann ein ganzes array mit einer einzigen Anweisung?
setzt alle Elemente des Arrays auf 0.