2010-03-22 3 views
4

나는 포트란 코드를 통과 할 것이고, 조금은 조금 혼란 스럽다. 서브 루틴이있다포트란 배열과 서브 루틴 (서브 배열)

는 말하여 다른 서브 루틴 호출

SUBROUTINE SSUB(X,...) 
REAL*8 X(0:N1,1:N2,0:N3-1),... 
... 
RETURN 
END 

: W는 '작업 배열'이다

CALL SSUB(W(0,1,0,1),...) 

. W의 특정 값이 X에 전달되지만 X는 배열로 치수가 지정됩니다. 무슨 일이야?

답변

7

원래 배열의 (N 차원에서 직사각형 인) 서브 세트에서 서브 루틴이 작동하도록하는 일반적인 사례는 아닙니다.

Fortran의 모든 매개 변수 (적어도 Fortran 90 이전)는 참조로 전달되므로 실제 배열 인수는 메모리의 위치로 확인됩니다. 안에 전체 배열에 할당 된 공간을 선택하고 서브 루틴은 배열의 일부만 조작합니다.

최대 문제 :be aware of how the array is laid out in memory과 Fortran의 배열 색인 체계가 어떻게 작동하는지 알아야합니다. Fortran은 c와 반대 개념 인 열 주요 배열 정렬을 사용합니다. 크기가 5x5 인 배열을 고려해보십시오 (그리고 c와의 비교를 쉽게하기 위해 0에서 양방향으로 색인을 생성합니다). 두 언어 모두 0,0은 메모리의 첫 번째 요소입니다. c에서 메모리의 다음 요소 [0][1]이지만 포트란에서는 (1,0)입니다. 이것은 서브 스페이스를 선택할 때 어떤 인덱스를 드롭할지에 영향을줍니다. 원본 배열이 A (i, j, k, l)이고 서브 루틴이 3 차원 부분 공간에서 작동한다면 (예 : Aprime[i=constant][j][k][l], 그러나 Fortran에서 Aprime(i,j,k,l=constant)에 관한 연구에서.

다른 위험은 감싸고 있습니다. 서브 루틴의 (서브) 배열의 크기는 호출 루틴의 그것들과 일치해야합니다. 또는 이상하고 이상한 일들이 일어날 것입니다. 따라서 A가 크기 (0 : 4,0 : 5,0 : 6,0 : 7)로 선언되고 요소 A(0,1,0,1)을 호출하면 수신 루틴은 자유롭게 각 차원의 인덱스를 자유롭게 시작할 수 있습니다. 크기는 (4,5,6)이어야하며 그렇지 않으면; 그러나 그것은 j 방향의 마지막 요소가 실제로 랩 어라운드한다는 것을 의미합니다! 이것에 대해해야 할 일은 이 아니며 마지막 요소를 사용합니다 (). 그 일이 일어나는지 확인하는 것은 프로그래머의 일이며, 엉덩이에 고통이 있습니다. 조심해. 많은 관심.

+0

예와 링크가 특히 유용합니다.0,0 또는 0,5를 말하는 것이 좋지만이 경우 0,1,0,1인데 두 번째 1은 어떻게 작동할까요? 다음 요소가 1,1,0,1이 될 것이며 첫 번째 차원 0,2,0,1 이후가 될 것입니까? – ccook

+0

댓글이 내 수정 사항을 넘었습니다. 호출 루틴에 주어진 마지막 인덱스는 호출 된 루틴에서 사실상 일정합니다. – dmckee

+0

아, 죄송합니다. 수정 사항은 분명 도움이됩니다. 나는 그 두 번째 1 번에 지금 문제가 있다고 생각한다. 이를 2 차원으로 가져 오는 것은 첫 번째 열, 두 번째 행의 인덱스에서 (0,1) 시작하여 배열에 순차적으로 '매핑'하는 것입니까? – ccook

2

의 포트란 변수는 주소로 전달됩니다. 따라서 W(0,1,0,1)은 값과 주소입니다. 그래서 기본적으로 W(0,1,0,1)에서 시작하는 하위 배열을 전달합니다.

+0

의견을 보내 주셔서 감사합니다. 나는 이것을 의심했지만 서브 어레이의 모양을 어떻게 설명 할 수 있습니까? 그것이 시작되는 곳이며 새로운 크기 조정에 어떻게 매핑되는지입니다. 새 크기 조정을 순차적으로 읽고 매핑합니까? – ccook

2

"시퀀스 연관"이라고합니다. 이 경우, 스케일러 인 것처럼 보이는 배열의 요소 (호출자의 실제 인수)는 배열 (암시 적으로 첫 번째 요소)과 연관되며 서브 루틴의 더미 인수입니다. 그 후 배열 요소는 "순서"라고하는 저장 순서로 연결됩니다. 이것은 Fortran 77 이전 버전에서 여러 가지 이유로 여기 작업 영역 배열에서 사용되었습니다. 아마도 프로그래머가 자체 메모리 관리를하고있을 것입니다. 이전 버전과의 호환성을 위해 Fortran> = 90에서 유지되지만 IMO는 새 코드에 속하지 않습니다.

+0

현대적인 접근 방식은 무엇입니까? – ccook