Ich möchte ein Array auf einer Zeile mit einer implizite do-Schleife initialisieren. Ich bekomme jedoch immer einen Syntax- oder Formfehler. Kann mir jemand helfen, das folgende Konstrukt zu korrigieren?Implizite Do-Schleife Array-Initialisierung
Antwort
Sie initialisieren ein Array mit MAXDIM
Zeilen und NR
Spalten, und es sieht so aus, als ob jede Spalte die Ganzzahlen 1 bis MAXDIM
enthält.
Als erster Schritt, gehen Sie vor und schreiben Sie den aktuellen DO
-loop:
do j=1,NR
do i=1,MAXDIM
myarray(i,j) = i
end do
end do
Collapse die innere Schleife zu einer impliziten Schleifenstruktur:
do j = 1,NR
myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /)
end do
Wenn wir versuchen, die zum Einsturz äußere Schleife, obwohl etwas Seltsames passiert:
myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)
Jetzt bekomme ich eine inc Kompatibler Rang Fehler wie Sie getan haben. Da ich auch nicht sehr gut an den impliziten do-Schleifen bin, habe ich mich die shape
intrinsischen Ergebnisse für den Array-Konstruktor:
print *, shape(myarray)
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /))
Dies gibt
5 10
50
Das Array Konstruktor einfach erweitert Ein 1-D-Array, das alle verschachtelten Array-Konstruktionen abflacht. Wir können tatsächlich den zweiten Satz von (/ /)
zur Vereinfachung fallen lassen. Da alles bereits in der richtigen Reihenfolge ist, können wir die reshape
intrinsische verwenden, um den richtigen Rang sicherzustellen. Mein volles Testprogramm ist dann:
program sotest
implicit none
integer, parameter :: MAXDIM = 5
integer, parameter :: NR = 10
integer :: i
integer :: j
integer :: myarray(MAXDIM, NR)
integer :: myarray_implicit(MAXDIM, NR)
do j = 1,NR
do i = 1,MAXDIM
myarray(i,j) = i
end do
end do
myarray_implicit = reshape((/ ((i,i=1,MAXDIM), j=1,NR) /), (/ MAXDIM, NR /))
print *, all(myarray == myarray_implicit)
end program sotest
Die implizite do-Schleife erzeugt nur einen Vektor, so dass Sie das umformen müssen. Etwas wie folgt aus:
integer, dimension(m,n) :: myarray
integer :: ix, jx
...
myarray = reshape([ (ix, ix = 1, m*n) ], [ m, n ])
oder vielleicht wollen Sie eine kompliziertere, verschachtelt, implizierte-do-Schleife:
myarray = reshape([ ((ix+jx, ix = 1, m), jx = 1, n) ], [ m, n ])
Bitte beachte, dass ich die Fortran2003 Konvention von [ ]
bin mit Array-Konstruktionen zu begrenzen, vielmehr als (/ /)
. Beachten Sie auch, dass Sie die impliziten do-Schleifenindexvariablen deklarieren müssen.
- 1. Scala testet implizite implizite Parameter?
- 2. Implizite Klasse vs Implizite Umwandlung in Eigenschaft
- 3. implizite Operator
- 4. Implizite Klassenkonvertierungen
- 5. Implizite Intent nicht
- 6. Implizite Modulsuche in Python?
- 7. Android implizite Absicht
- 8. Implizite Typumwandlung funktioniert nicht
- 9. Implizite Parameter erforderlich
- 10. java accidential implizite Schnittstellenimplementierung
- 11. C# implizite Konvertierungen
- 12. scala Eingabe erfordern implizite
- 13. Scala implizite Nutzung Entscheidungen
- 14. Was ist implizite Freigabe?
- 15. Implizite DAE-Massenmatrix Python
- 16. Implizite Verwendung von destructor
- 17. Facebook Pixel implizite PageView
- 18. C++ implizite template Instanziierung
- 19. Implizite Aufhebung in scala
- 20. Scala implizite Typumwandlung und ==
- 21. Implizite Destruktorausführung in Funktionsaufruf
- 22. Implizite Konvertierung mit Operator
- 23. Coq: implizite Variablen hinzufügen
- 24. C# implizite Konvertierung Problem
- 25. Implizite Konvertierung in Vorlage
- 26. Implizite Konvertierung funktioniert nicht
- 27. Implizite Version von IsAssignableFrom?
- 28. Java implizite Methoden/Parameter?
- 29. float/int implizite Konvertierung
- 30. skalare implizite Ursachen StackOverflowError
Beachten Sie, dass es auch gültig ist 'myarray_implicit = reshape ((/ ((i zu schreiben, i = 1, MAXDIM), j = 1, NR) /), shape (myarray_implicit)) ' , um zu vermeiden, die Dimensionen Ihrer Matrix erneut explizit einzugeben. – Markus