subrutinas resueltos raiz programas programación problemas funciones ejemplos cuadrada function pointers fortran alias subroutine

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