function - raiz - problemas resueltos de programación en fortran 95 pdf
Cómo alias un nombre de función en Fortran (2)
La mayoría de las implementaciones de Fortran no tienen una forma estándar de manipular punteros de función o punteros de procedimiento. Sin embargo, Fortran 2003 y posteriores tienen algo. (Consulte la página 6 de this ).
Para la situación dada, esto funcionará bastante bien en su lugar:
function func1 (p1, p2, etc)
... as you have it already
end
function func2 (p1, p2, etc)
... as you have it already
end
function funcselect (a, p1, p2, etc)
if (a < 0) then
x = func1 (p1, p2, etc)
else
x = func2 (p1, p2, etc)
endif
end
Luego simplemente llame a funcselect
con el parámetro adicional en lugar de lo que habría hecho con loop_func
.
No estoy seguro si el título está bien puesto. Sugerencias bienvenidas.
Esto es lo que quiero hacer. Verifique una condición y luego decida qué función usar en un bucle. Por ejemplo:
if (a < 0) then
loop_func = func1
else
loop_func = func2
endif
Entonces puedo usar loop_func
como un puntero al escribir mi ciclo. Ambas funciones toman exactamente las mismas entradas, y son diferentes enfoques para abordar el problema en función del valor de a
. Esto me permitirá tener solo un bloque de código, en lugar de dos bloques casi idénticos. Esto también podría aplicarse a las subrutinas.
¿Alguna idea de cómo esto podría implementarse?
Gracias.
Sí, Fortran tiene punteros de procedimiento, por lo que puede, en efecto, alias un nombre de función. Aquí hay un ejemplo de código que asigna al puntero de función "f_ptr" una función u otra. A partir de entonces, el programa puede usar "f_ptr" y la función seleccionada será invocada.
module ExampleFuncs
implicit none
contains
function f1 (x)
real :: f1
real, intent (in) :: x
f1 = 2.0 * x
return
end function f1
function f2 (x)
real :: f2
real, intent (in) :: x
f2 = 3.0 * x**2
return
end function f2
end module ExampleFuncs
program test_func_ptrs
use ExampleFuncs
implicit none
abstract interface
function func (z)
real :: func
real, intent (in) :: z
end function func
end interface
procedure (func), pointer :: f_ptr => null ()
real :: input
write (*, ''( / "Input test value: ")'', advance="no" )
read (*, *) input
if ( input < 0 ) then
f_ptr => f1
else
f_ptr => f2
end if
write (*, ''(/ "evaluate function: ", ES14.4 )'' ) f_ptr (input)
stop
end program test_func_ptrs