Szukaj…


Podprogramy wewnętrzne / modułowe i jawne interfejsy

Podprogram (który definiuje procedurę ) może być subroutine lub function ; mówi się, że jest to wewnętrzny podprogram, jeśli jest wywoływany lub wywoływany z tego samego program lub podprogramu, który go contains , w następujący sposób

program my_program

  ! declarations
  ! executable statements,
  ! among which an invocation to
  ! internal procedure(s),
  call my_sub(arg1,arg2,...)
  fx = my_fun(xx1,xx2,...)

contains
  
  subroutine my_sub(a1,a2,...)
    ! declarations
    ! executable statements
  end subroutine my_sub

  function my_fun(x1,x2,...) result(f)
    ! declarations
    ! executable statements
  end function my_fun

end program my_program

W takim przypadku kompilator będzie wiedział wszystko o każdej procedurze wewnętrznej, ponieważ traktuje jednostkę programu jako całość. W szczególności „zobaczy” interface procedury, to znaczy

  • czy jest to function czy subroutine ,
  • które są nazwami i właściwościami argumentów a1 , a2 , x1 , x2 , ...,
  • które są właściwościami wyniku f (w przypadku function ).

Będąc znanym interfejsem, kompilator może sprawdzić, czy rzeczywiste argumenty ( arg1 , arg2 , xx1 , xx2 , fx , ...) są zgodne z argumentami a1 ( a1 , a2 , x1 , x2 , f , .. .).

W tym przypadku mówimy, że interfejs jest jawny .

Podprogram jest nazywany podprogramem modułu, gdy jest wywoływany przez instrukcję w samym module zawierającym,

module my_mod

  ! declarations

contains
  
  subroutine my_mod_sub(b1,b2,...)
    ! declarations
    ! executable statements
    r = my_mod_fun(b1,b2,...)
  end subroutine my_sub

  function my_mod_fun(y1,y2,...) result(g)
    ! declarations
    ! executable statements
  end function my_fun

end module my_mod

lub poprzez instrukcję w innej jednostce programowej, która use tego modułu,

program my_prog

  use my_mod

  call my_mod_sub(...)

end program my_prog

Podobnie jak w poprzedniej sytuacji, kompilator będzie wiedział wszystko o podprogramie i dlatego mówimy, że interfejs jest jawny .

Zewnętrzne podprogramy i niejawne interfejsy

Podprogram jest uważany za zewnętrzny, jeśli nie jest zawarty w programie głównym, ani w podprogramie modułu lub antoher. W szczególności można go zdefiniować za pomocą języka programowania innego niż Fortran.

Podczas wywoływania zewnętrznego podprogramu kompilator nie może uzyskać dostępu do swojego kodu, więc wszystkie informacje dozwolone dla kompilatora są domyślnie zawarte w instrukcji wywołania programu wywołującego oraz w typie właściwości argumentów ostrych, a nie fałszywych argumentów ( którego deklaracja jest nieznana kompilatorowi). W tym przypadku mówimy, że interfejs jest niejawny .

Można użyć instrukcji external aby określić, że nazwa procedury jest względna do procedury zewnętrznej,

external external_name_list

ale mimo to interfejs pozostaje niejawny.

Blok interface można wykorzystać do określenia interfejsu procedury zewnętrznej,

interface
  interface_body
end interface

gdzie interface_body jest zwykle dokładną kopią nagłówka procedury, po której następuje deklaracja wszystkich jej argumentów i, jeśli jest funkcją, wyniku.

Na przykład dla funkcji WindSpeed

real function WindSpeed(u, v)
  real, intent(in) :: u, v
  WindSpeed = sqrt(u*u + v*v)
end function WindSpeed

Możesz napisać następujący interfejs

interface
  real function WindSpeed(u, v)
    real, intent(in) :: u, v
  end function WindSpeed
end interface


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow