Funciones y pasaje de argumentos

El siguiente programa calcula una función y su derivada, y la escriben en pantalla.

      program derivada
c.....
c.....Este programa calcula una funcion y su derivada
c.....

      implicit none
c.....Declaracion de variables
      real*8 x,xi,xf,h,step
      integer npoints,i
c.....
c..... Aqui se declaran las FUNCIONES que estan definidas mas
c..... abajo. Si estas funciones estan definidas en otro archivo
c..... hay que declararlas como
c.....    real*8,external fun,der
c.....
      real*8 fun,der

c.....numero de puntos
      npoints = 1000

c.....dominio de la funcion
      xi = 0d0
      xf = 2d0

c.....parametro para calcular la derivada
      h = 1d-5

c.....paso
      step = (xf-xi)/npoints     

      do i=1,npoints
          ! Actualizo x
          x = i*step+xf
          ! Escribo la derivada en la pantalla     
          write(*,'(3f20.10)') x,fun(x),der(fun,x,h)
      end do


      end

c
c     Funcion que quiero dibujar
c
      real*8 function fun(x)
      implicit none
      real*8 x

      fun = x**2+x
      return
      end
c
c     Funcion que calcula la derivada de la funcion fx
c

      real*8 function der(fx,x,h)
      implicit none
      real*8 fx,h,x

      der = (fx(x+h)-fx(x))/h

      return
      end
 



Hay varios puntos a notar:
              real*8 fun,der

        estamos declarando dos funciones que están definidas más abajo. La declaración de la función en el programa principal le anuncia al mismo qué funciones va a usar. Estas funciones tienen que estar definidas en el mismo archivo. Si no es así, debemos declararlas como externals:

              real*8, external fun,der

 ./derivada.x > derivada.dat
                         ./derivada.x >> derivada.dat                          ./derivada.x >! derivada.dat