문제

누군가가 파서 / 컴파일러에서 어떤 종류의 추상화가 더미 변수 또는 속성에 해당하는지 설명 할 수 있습니까?

      PURE SUBROUTINE F(X, Y)
        IMPLICIT NONE
        REAL, INTENT(INOUT) :: X, Y, C
C        REAL :: A, B
C        REAL, SAVE :: C = 3.14E0
        PARAMETER (C = 3.14E0, X = 32, Y = X)
        X = Y + 2 * SIN(Y)
      END

cetin@unique:~/lab/secret/tapenade$ gfortran -x f77 -c 1.f 
1.f:6.37:

        PARAMETER (C = 3.14E0, X = 32, Y = X)                           
                                    1
Error: PARAMETER attribute conflicts with DUMMY attribute in 'x' at (1)
1.f:3.38:

        REAL, INTENT(INOUT) :: X, Y, C                                  
                                     1
Error: Symbol at (1) is not a DUMMY variable

cetin@unique:~/lab/secret/tapenade$ ifort -c 1.f
1.f(3): error #6451: A dummy argument name is required in this context.   [C]
        REAL, INTENT(INOUT) :: X, Y, C
-------------------------------------^
1.f(6): error #6406: Conflicting attributes or multiple declaration of name.   [X]
        PARAMETER (C = 3.14E0, X = 32, Y = X)
-------------------------------^
1.f(6): error #6406: Conflicting attributes or multiple declaration of name.   [Y]
        PARAMETER (C = 3.14E0, X = 32, Y = X)
---------------------------------------^
1.f(6): error #6592: This symbol must be a defined parameter, an enumerator, or an argument of an inquiry function that evaluates to a compile-time constant.   [X]
        PARAMETER (C = 3.14E0, X = 32, Y = X)
-------------------------------------------^
compilation aborted for 1.f (code 1)
도움이 되었습니까?

해결책

Fortran은 참조로 통과합니다. 더미 속성은 함수에 전달되는 변수에 해당합니다 (X 그리고 Y 귀하의 경우). 매개 변수 명령문은 정적을 기대하고 있지만 그 이후로 X 함수에 전달되는 것이 무엇이든, 실제로는 의미가 없습니다. 매개 변수 명령문은 상수를 설정하는 방법입니다. 매개 변수와 서브 루틴과 관련이 없습니다.

당신이 그렇게 말하는 오류를 얻을 때 C 아닙니다 DUMMY 그렇다면 변수는 C 함수로 전달 될 변수 목록에서 - 선언은 전용입니다. F(X, Y): 아니요 C 통찰력. 당신이 사용하지는 않지만 DUMMY 명시 적으로 속성이 있습니다 INTENT(INOUT) 속성은 이러한 변수가 서브 루틴 입력/출력에 해당 함을 의미합니다.

원하는 것을 얻으려면 다음과 같은 것처럼 보이는 서브 루틴이 있습니다.

subroutine F(X, Y)
    implicit none

    ! These are the dummy variables
    real, intent(inout) :: X, Y

    ! These are the variables in the scope of this subroutine
    real                  :: a, b
    real, parameter, save :: c = 3.14E0

    X = Y + 2*sin(Y)
end subroutine F

나는 당신이 무엇을하려고하는지 완전히 확신하지 못합니다 - 당신은 pure 부작용이없는 서브 루틴을 의미하지만 사용 중입니다. intent(inout) 당신의 변수의 경우, 즉 X 그리고 Y 실행 과정에서 변경 될 수 있습니다.

나는 서브 루틴 안에서도 다음과 같은 선언문에서 변수를 초기화하는 것을 추가 할 것입니다. REAL :: C = 3.14E0 An과 변수를 생성합니다 절대적인 save 기인하다. 전화로 전화로 저장되기를 원한다면, 당신은 명시 적으로 추가하여 올바른 일을했습니다. save 그것이 당신이하고있는 일임을 분명히하는 것입니다.

나는 파서/컴파일러 사람이 아니지만, 당신의 질문에 대답하기 위해 dummy 속성은 포인터를 얻는다는 것을 의미합니다. 함수 호출에 사용 된 변수에는 이미 공간이 할당되었으므로 공간을 할당 할 필요가 없습니다.

다른 팁

통화의 실제 문제는 Tim Whitcomb가 잘 설명합니다. 나는 용어를 더 명시 적으로 설명하려고 노력할 것입니다.

더미 논쟁 Fortran 특정 용어입니다. 다른 언어가 부르는 것입니다 공식 매개 변수 또는 유사하게, 즉, 그것은 불리는 객체입니다. X 그리고 Y (당신의 경우) 그리고 마녀는 실제 주장 절차가 호출되는 경우.

따라서 :

subroutine s(i)
  integer :: i
end

call s(1)

그만큼 i 서브 루틴의 더미 논쟁입니다 s 표현하는 동안 1 더미 논쟁으로 서브 루틴에 전달되는 실제 논쟁입니다. i.

속성 데이터 객체 또는 절차의 추가 속성을 지정하는 형태입니다. 속성은 진술을 사용하여 지정할 수 있습니다.

real c
intent(in) c
optional c

또는 단일 선언으로 지정할 수 있습니다.

real, intent(in), optional :: c

이런 식으로 더미 논쟁 c 속성이있는 기본값입니다 intent(in) 그리고 optional.

상충되는 속성 한 객체에 대해 동시에 지정할 수없는 속성입니다. 당신의 예 intent(...) 그리고 parameter 잘 봉사합니다. 이것들은 첫 번째가 더미 인수를 암시하고 다른 사람은 Constant로 명명되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top