2017-09-08 9 views
1

입력으로 1 차원 배열 또는 2 차원 배열을 취할 수있는 서브 루틴을 작성하려고합니다. 서브 루틴의 입력이 벡터 또는 행렬 일 수 있다고 어떻게 선언 할 수 있습니까?서브 루틴에서 자유 차원 배열

I이 경우이 : I 명확 서브 루틴에서 입력으로 매트릭스를 통과 할 수

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

. 비 우아한 해결책은 벡터화 된 형식으로 행렬을 전달한 다음 서브 루틴 내부에 행렬 형식으로 다시 배열하는 것입니다 (물론 두 개의 추가 입력이 필요합니다). 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

1

일반 인터페이스를 만드는 것은 꽤 깨끗한 방법입니다. 이 MAP/연합 1D의 당신이 차원을 한 1D로 1D을 통과하고도 통과 할 수 있도록

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

는 인텔과 함께 당신은 또한, MAP/UNION을 사용할 수 있습니다 (주석 당,하지만 난 가치가 최대 쓰기 불구하고) 번역.

RESHAPE를 사용하고 싶지만 일반적으로 수행하는 작업에 따라 필요하지 않습니다.

"분명히 행렬을 전달할 수 없다"는 귀하의 의견은 내가 아는 바에 대한 것 같습니다. 그것이 2D이고, 항상 2D라면 아무런 문제가 없습니다. 순위를 전달할 수 있습니다.