2009-06-28 18 views
6

Czy ktoś może mi wyjaśnić, jakiego rodzaju abstrakcji w parserze/kompilatorze odpowiada zmienna lub atrybut atrapa?Terminologia kompilatora Fortran: zmienne atrybuty i atrybuty

 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 

[email protected]:~/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 

[email protected]:~/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) 

Odpowiedz

9

Fortran przechodzi przez odniesienie. Atrybut dummy odpowiada zmiennym, które są przekazywane do funkcji (X i Y w twoim przypadku). Oświadczenie parametru oczekuje czegoś statycznego, ale ponieważ X jest tym, co jest przekazywane do funkcji, to naprawdę nie ma to żadnego sensu. Instrukcja parameter jest sposobem na ustawienie stałych - nie ma nic wspólnego z parametrami podprogramu.

Gdy pojawi się błąd mówiący, że C nie jest zmienną DUMMY, to oznacza to, że nie jest znalezienie C na liście zmiennych, które zostaną przekazane do/z funkcją - Twoja deklaracja jest tylko F(X, Y): brak C w zasięgu wzroku. Chociaż nie używasz jawnie atrybutu DUMMY, masz atrybut INTENT(INOUT), co oznacza, że ​​te zmienne odpowiadają wejściowemu/wyjściowemu podprogramu.

Aby dostać to, czego chcesz, to masz podprogram, który wygląda mniej więcej tak:

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 

Nie jestem do końca pewien, co chce zrobić - jesteś deklarowania pure podprogram, co oznacza, podprogram bez efektów ubocznych, ale używasz intent(inout) dla zmiennych, co oznacza, że ​​X i Y mogą być zmieniane w trakcie wykonywania.

Chciałbym dodać również, że wewnątrz podprogramu, inicjalizacji zmiennej w swoim oświadczeniu deklaracji jak REAL :: C = 3.14E0 daje zmienną o niejawnysave atrybutu. Jeśli chcesz, aby zapisywał się on z rozmowy telefonicznej, zrobiłeś to, co trzeba, jawnie dodając atrybut save, aby było jasne, że właśnie to robisz.

Nie jestem parserem/kompilatorem, ale myślę, że aby odpowiedzieć na twoje pytanie, atrybut dummy oznacza, że ​​właśnie dostajesz wskaźnik - nie musisz przydzielać żadnej przestrzeni, ponieważ zmienna używana w wywołaniu funkcji już przydzielono miejsce.

3

Rzeczywisty problem z połączeniem jest dobrze wyjaśniony przez Tim Whitcomb. Spróbuję dokładniej wyjaśnić warunki.

Manekinowy argument to termin specyficzny dla Fortranu. To, co inne języki nazywają formalne parametry lub podobne, tj. Jest to obiekt o nazwie X i Y (w twoim przypadku) i wiedźma zostaje powiązana z rzeczywistym argumentem po wywołaniu procedury.

Zatem w:

subroutine s(i) 
    integer :: i 
end 

call s(1) 

w i manekina argument podprogramu s natomiast ekspresja 1 jest rzeczywisty argument przechodzi do podprogramu, do manekina argumentu i.

Atrybuty są formą określania dodatkowych właściwości obiektów danych lub procedur. Atrybuty mogą być określone za pomocą oświadczenia:

real c 
intent(in) c 
optional c 

lub mogą być podane w pojedynczym zgłoszeniu:

real, intent(in), optional :: c 

ten sposób manekin argumentem c jest domyślnym rzeczywistym z atrybutami intent(in) i optional.

Atrybuty sprzeczne to atrybuty, których nie można określić dla jednego obiektu w tym samym czasie. Twój przykład z intent(...) i parameter dobrze służy. Są one niekompatybilne, ponieważ pierwsza z nich implikuje fałszywy argument, a druga określa stałą o nazwie o stałej.