2013-08-02 2 views
4

포트란 프로그램의 파일에서 많은 양의 데이터를 읽어야합니다. 데이터의 크기는 가변적이므로 배열을 동적으로 할당하고 싶습니다. 내 생각은 모든 데이터를 읽고 메모리를 할당하는 서브 루틴을 만드는 것이다. 프로그램의 단순화 된 버전은 다음과 같습니다포트란 서브 루틴에서 배열 할당

Error: Dummy argument 'v' of procedure 'memory' at (1) has an attribute that requieres an explicit interface for this procedure 

이 구조의 올바른 방법으로 프로그램의 종류 :

program main 

    implicit none 
    real*8, dimension(:,:), allocatable :: v 
    integer*4 n 

    !This subroutine will read all the data and allocate the memory 
    call Memory(v,n) 

    !From here the program will have other subroutines to make calculations 

    end 


    subroutine Memory(v,n) 

    implicit none 
    real*8, dimension(:,:), allocatable :: v 
    integer*4 n,i 

    n=5 
    allocate(v(n,2)) 
    do i=1,n 
    v(i,1)=1.0 
    v(i,2)=2.0 
    enddo 

    return 
    end subroutine Memory 

이 프로그램은 나에게 다음과 같은 오류를 준다? 그렇다면 어떻게 해결할 수 있습니까?

감사합니다.

답변

8

당신이 게시물에서 알 수 있듯이, 가장 쉬운 수정 문

을 포함하는 행과 함께 문

end 

를 포함하는 라인을 교체하는 것입니다, 프로그램 및 서브 루틴을 모두 포함하는 단일 소스 파일이 있다고 가정

contains 

, 쓰기, 소스의 끝에있는 문

end program 
포함하는 행을 파일 6,

은 (예, 키워드 program이 필요하지만 유용하지 않습니다.)

컴파일러가보고 한 문제는 당신이 당신의 코드를 구조화 된 것처럼, 프로그램이 서브 루틴의 인터페이스에 대해 아무것도 모르고 있다는 것입니다

memory 인 경우 해당 인터페이스는 포트란 용어로 암시 적입니다. 서브 루틴을 호출하고 할당 가능 배열을 전달하거나 전달하려는 경우 서브 루틴에 명시 적 인터페이스가 있어야합니다.

명시 적 인터페이스를 제공하는 데는 여러 가지 방법이 있습니다. 하나는 제가 여러분에게 보여 드렸듯이 프로그램 내에 서브 루틴을 포함하는 것입니다. 프로그램이 조금 더 커지면, 서브 루틴을 모듈에 작성하고이를 사용하려는 프로그램에서 서브 루틴을 사용 - 연관시키는 것입니다. moduleuse 문을 포함하는 포트란 자습서의 부분을 읽으십시오.

다른 옵션이 하나 이상 있지만 특히 초보자에게 적합하지 않으므로 여기서는 언급하지 않겠습니다.

그리고 쓰는 동안 intent 키워드를 사용하여 서브 루틴에 대한 인수를 읽거나 쓰거나 둘 다 지정할 수 있습니다. 이것은 안전한 프로그래밍에 큰 도움이되며, 좋아하는 Fortran 리소스가 자세히 설명됩니다.

+0

감사합니다. 실제 프로그램에 여러 개의 파일이 있으므로 모듈 접근 방식을 시도 할 것입니다. – Msegade

+5

그리고 또 다른 제안을 할 수 있습니다 - 비표준 실제 * 8 및 정수 * 4 구문의 사용을 "해제"하려고하면 유연성이 제한됩니다. 널리 사용되는 방법은 SELECTED_INT_KIND 및 SELECTED_REAL_KIND를 사용하여 SP 및 DP와 같이 사용할 매개 변수에 대한 일련의 PARAMETER 상수를 선언 한 다음, REAL (DP)을 선언에 사용하는 모듈 KINDS를 정의하는 것입니다. Mark는 모듈이 가장 좋은 방법이라고 여기는 것에 동의합니다. –

관련 문제