Hi Stefan,
The simplest approach is to block out the name "error" in the USE
statement in advanced_mod:
use simple_mod, block_name=>error
That will start a new generic named "error" in advanced_mod, rather than
extend the one in simple_mod (which is now named "block_name" in the
scope of advanced_mod).
Cheers,
Bill
On 10/21/12 11:29 AM, Stefan Mauerberger wrote:
> Hi There!
>
> I ran again into a problem which I can not resolve. The story is that I
> wrote a module which contains - amongst other stuff - a derived-type and
> a very basic function for handling errors. I would call it
> self-contained.
>
> module simple_mod
>
> type :: simple_cls
> character :: c
> contains
> procedure :: hello
> end type
>
> interface error
> procedure simple_error
> end interface
>
> contains
>
> subroutine hello(self)
> class(simple_cls)::self
> call error( self%c )
> end subroutine hello
>
> subroutine simple_error( msg )
> character(*):: msg
> write(*,*) 'simple: ', msg
> end subroutine simple_error
>
> end module simple_mod
>
> Up to now this is perfectly fine. The thing I like about the
> self-contained approach is that this module does not have any
> dependencies and can be used 'stand alone'.
>
> Someone might want to extend its type which is also fine. However, I am
> not satisfied with its deficient error handling function. My main
> program has its own, more comprehensive error handler. So, the idea is
> to 'simply' overload it, but, I don't know weather this is possible nor
> how.
>
> My first attempt was to override the above generic interface:
>
> module advanced_mod
> use simple_mod
>
> type, extends(simple_cls) :: advanced_cls
> end type
>
> interface error
> procedure advanced_error
> end interface
>
> contains
>
> subroutine advanced_error( msg )
> character(*):: msg
> integer :: i
> write(*,*) 'advanced: ', msg
> end subroutine advanced_error
>
> end module advanced_mod
>
> Unfortunately, this does not work, at all. Instead of overloading, it
> wants to extend the interface which is not possible due to ambiguities.
>
> I read a lot about interfaces, external and deferred procedures but
> can't come up with a solution.
>
> Is there a way, to put my ideas of overloading the error procedure into
> practice? (This is also a question of good coding style and best
> practice; my intention is to produce well written programs)
>
> Thank you in advance and all the best!
>
> Stefan
>
--
Bill Long [log in to unmask]
Fortran Technical Support & voice: 651-605-9024
Bioinformatics Software Development fax: 651-605-9142
Cray Inc./Cray Plaza, Suite 210/380 Jackson St./St. Paul, MN 55101
|