2017-09-08 5 views
1

J'essaie d'écrire un sous-programme qui peut prendre en entrée un tableau unidimensionnel OU un tableau bidimensionnel. Comment puis-je déclarer que l'entrée du sous-programme peut être un vecteur ou une matrice?Tableau de dimension libre en tant qu'entrée dans le sous-programme

Si je fais ceci:

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

Je ne peux évidemment pas passer une matrice comme une entrée dans le sous-programme. Une solution non élégante pourrait être de passer la matrice sous forme vectorisée et de la ré-agencer sous forme matricielle à l'intérieur du sous-programme (il me faudrait bien sûr deux entrées supplémentaires). Existe-t-il une meilleure façon de le faire?

Répondre

1

la création d'une interface générique semble être un moyen plutôt simple de le faire. (Par commentaire, mais je pensais que la peine rédaction)

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

Avec Intel, vous pouvez également utiliser MAP/UNION, de sorte que vous pouvez passer le 1d comme un 1d, et aussi passer en 2D comme il est MAP/UNION 1D version.

Vous pouvez utiliser RESHAPE, mais ce n'est généralement pas nécessaire, en fonction de ce que vous faites.

Votre commentaire de "clairement ne peut pas passer dans une matrice" semble aller à l'encontre de ce que je sais. Si c'est 2D, et toujours 2D, alors il n'y a aucun problème. Vous pouvez passer n'importe quel rang.