2014-12-22 1 views
1

배열의 행을 뒤집기 위해 서브 루틴을 작성하려고합니다. 다음은 작동하지만 입력 arr의 유형을 명시 적으로 선언합니다. 따라서 유형의 실제 배열에 대해 동일한 작업을 수행하려면 별도의 서브 루틴이 필요합니다. 분명히 임의의 유형의 배열을 허용하는 방법이 있습니다. 누군가가 구문을 도와 줄 수 있습니까? 감사!fortran 서브 루틴 : 임의 유형의 배열

SUBROUTINE flipud(arr) 

    integer, dimension(:,:), intent(inout) :: arr 
    integer, dimension(:,:), allocatable :: tmp 
    integer i, j, nrow, ncol, ierr 

    nrow = size(arr, 1) 
    ncol = size(arr, 2) 

    allocate(tmp(nrow, ncol), STAT=ierr) 

    tmp(:,:) = arr(nrow:1:-1, :) 
    arr = tmp 
    deallocate(tmp) 

END SUBROUTINE flipud 
+5

난 그냥 표현'편곡 =의 편곡 사용합니다 (nrow : 1 : -1 :)' –

+0

는 동의했다. 그런 간단한 작업을 위해 추상화의 추가 레이어를 도입하는 이유는 무엇입니까? –

+0

@VladimirF, 찍은 시점. 아마 포트란이 내 강한 옷이 아니라고 말할 수 있습니다. 나는 실제로 그렇게하고 있었고 작동하지 않았고 구문이 내가 생각했던대로 작동하지 않는지 궁금했습니다. (이것은 실제로 ascii 파일을 파싱하는 큰 문제의 일부입니다.하지만 거꾸로 뒤집혀서 또는 어떤 것으로 바뀌 었습니다. 그리고 디버깅하려고합니다. 다른 문제로 인해 발생했을 것입니다 ...) 어쨌든 , 감사; 나는 변화를 만들었다. –

답변

1

Fortran에는 C++ 템플릿과 동일한 기능이 없습니다. 아래에 설명 된대로 모듈 프로 시저를 사용하여 인터페이스를 만들 수 있습니다. 두 서브 루틴에 공통적 인 코드는 INCLUDE 문을 사용하여 통합 된 파일에 배치 될 수 있습니다.

module foo 
interface fliupud 
    module procedure flipud_i,flipud_r 
end interface flipud 

contains 
subroutine flipud_i(arr) 
integer, dimension(:,:), intent(inout) :: arr 
! body 
end subroutine flipud_i 
! 
subroutine flipud_r(arr) 
real, dimension(:,:), intent(inout) :: arr 
! body 
end subroutine flipud_r 
end module foo 
+4

예,하지만 그 이유는 무엇입니까? 그리고 @BladimirF의 의견이 이미 포함되어 있지 않은 '신체'에 대해 당신은 무엇을 제안하겠습니까? –

관련 문제