Fortran
Jawne i niejawne interfejsy
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
czysubroutine
, - 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 przypadkufunction
).
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