Obecně bych nedoporučoval měnit obsah knihovny. Vhodnejším řešením je napsat wrapper a nebo využít introperability fortranu s C.
Predpokladejme, ze v knihovne je napr. nejake funkce
int knihovniFunkce(double x);
pak by jednoduchy wrapper mel vypadat takto (soubor wrapper.c):
int kfunkce_(double *x) {
return knihovniFunkce(*x);
}
Je treba 1) pridat spravny pocet podtrzitek (nektere prekladace davaji 0, nektere 1 a nektere 2 podtrzitka) a 2)pouzit spravnou velikost pismen a konecne 3) prizpusobit predevani parametru vcetne ohlidani typu (int neni vzdy stejne, jako INTEGER).
Pak je mozne z fortranu volat
J = KFUNKCE(X)
Jeste lepsi se mi ale jevi pouziti interoperability fortranu a C. Ta je zavedena tusim az ve fortranu 2003, ale nektere f90/f95 prekladace (vcetne gfortranu a intelovskeo ifortu) to umi.
Ja napriklad pouzivam volani jazyka lua z fortranu a k tomu jsem si napsal modul, ktery vypada zhruba takto (kraceno):
module flua
use ISO_C_BINDING
...
interface
subroutine lua_close(L) bind(C,name="lua_close")
use ISO_C_BINDING
type(C_PTR), value :: L
end subroutine lua_close
...
end module flua
Predpokladam, ze pro vyse uvedeny priklad s wrapperem by stacilo misto wrapperu do fortranskeho zdrojaku dat
use ISO_C_BINDING
interface
function kfunkce(double x) result(f) bind(C,name="knihovniFunkce")
use ISO_C_BINDING
integer(C_INT) :: f
real(C_DOUBLE), value :: x
end function kfunkce
end function kfunkce
end interface