Dienstag, Dezember 10, 2019

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

2 Kommentare

  1. 2

    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…

  2. 1

    Sind Sie sich bewusst, dass Sie initialisieren kann ein ganzes array mit einer einzigen Anweisung?

    coeffs = 0.0d
    

    setzt alle Elemente des Arrays auf 0.

    • Haben Sie tatsächlich Lesen Sie den code ? Insbesondere die 10te Zeile ?
    • Ich bin mir bewusst, dass – Sie werden feststellen, dass ich das in den code auf der Linie 10. Insbesondere, Initialisiere ich den gesamten array mit zwei unterschiedlichen Methoden (single-Anweisung und Schleife), von denen jede nicht endlich Arbeit. Ich habe auch initialisieren einem einzigen element und das funktioniert, aber nur für das element aus. Es ist keine Frage, dass ich jedes element manuell initialisieren, da es in der Regel über eine Millionen Elemente.

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...