2017-09-08 2 views
1

Ich versuche ein Unterprogramm zu schreiben, das als Eingabe ein eindimensionales Array ODER ein zweidimensionales Array verwenden kann. Wie kann ich erklären, dass die Eingabe des Unterprogramms entweder ein Vektor oder eine Matrix sein kann?Freidimensionales Array als Eingabe im Unterprogramm

Wenn ich dies tun:

SUBROUTINE TEST1(x) 
    REAL, INTENT(IN) :: x(:) 
    <do something> 
END SUBROUTINE TEST1 

ich eindeutig nicht um eine Matrix als eine Eingabe in das Unterprogramm übergeben kann. Eine nicht-elegante Lösung könnte sein, die Matrix in vektorisierter Form zu übergeben und sie dann in Matrixform innerhalb der Subroutine neu anzuordnen (ich würde natürlich ein paar zusätzliche Eingaben benötigen). Gibt es einen besseren Weg, dies zu tun?

Antwort

1

Erstellen einer generischen Schnittstelle scheint eine ziemlich saubere Möglichkeit, es zu tun. (Pro Kommentar, aber ich allerdings wert schriftlich bis)

module gen 
interface test1 
module procedure t1,t2 
end interface 
contains 
subroutine t1(y) 
real y(:) 
write(*,*)'shape is',shape(y) 
y=2*y 
end subroutine 
subroutine t2(y) 
real y(:,:) 
write(*,*)'shape is',shape(y) 
y=2*y 
end subroutine 
end module 

use gen 
real m(4),n(3,3) 
m=4 
n=3 
call test1(m) 
call test1(n) 
end 
0

Mit Intel Sie können auch MAP/UNION verwenden, so dass Sie die 1d als einen 1d passieren können, und liefern auch die 2D wie es MAP/UNION 1D ist Ausführung.

Sie können RESHAPE verwenden, aber normalerweise wird es nicht benötigt, je nachdem, was Sie tun.

Ihr Kommentar von "klar kann nicht in einer Matrix übergeben" scheint entgegen zu dem, was ich weiß. Wenn es 2D und immer 2D ist, gibt es überhaupt kein Problem. Sie können jeden Rang in.

übergeben
Verwandte Themen