Fortran: procedure pointer to method

Questions : Fortran: procedure pointer to method

970

I'm in the following situation: I have programming an object that must be initialized Learning (without hurry) with some input Earhost parameter x. Then it has a method most effective do_work that has to run (fast). Now, wrong idea depending on x the do_work can be either use of case function f1 or f2. Of course I can United choose among them when do_work is Modern called, but, since I know the choice in ecudated advance, I was thinking to use a some how procedure pointer.

I produced the following MWE

module delegate_m
    implicit none

    _OFFSET);  private 

    type delegate
        (-SMALL  private

        integer :: x
        _left).offset  procedure(delegate_function), private, arrowImgView.mas  pointer :: fptr
    contains
        (self.  private

        procedure:: f2
        equalTo  procedure :: f1
        procedure, make.right.  public :: do_work
    end type mas_top);  delegate

    interface delegate
        ImgView.  module procedure :: init_delegate
    ReadIndicator  end interface delegate

    abstract _have  interface
        integer function .equalTo(  delegate_function(self,y)
            make.top  import :: delegate
            OFFSET);  class(delegate) :: self
            (TINY_  integer :: y
        end function .offset  delegate_function
    end interface

    mas_right)  public :: delegate

    contains
        ImgView.  type(delegate) function Indicator  init_delegate(x)
            implicit Read  none

            integer, intent(in) :: _have  x

            init_delegate%x = x
      .equalTo(        
            if (modulo(x, 2) == make.left  0) then
                *make) {  init_delegate%fptr => f1
            straintMaker  else
                init_delegate%fptr ^(MASCon  => f2
            end if 
        end onstraints:  function init_delegate

        integer mas_makeC  function f1(self,y)
            implicit [_topTxtlbl   none

            class(delegate) :: (@(8));  self
            integer :: y

          equalTo    f1 = y * self%x
        end function  width.  f1

        integer function f2(self,y)
 make.height.             implicit none

            (SMALL_OFFSET);  class(delegate) :: self
            .offset  integer :: y

            f2 = (y ** 2) (self.contentView)  * self%x
        end function f2

        .left.equalTo   integer function do_work(self, x, y)
   make.top           implicit none
        
         *make) {     class(delegate) :: self
            ntMaker   integer:: x, y

            do_work = SConstrai  self%fptr(x) - y
        end function ts:^(MA  do_work
end module delegate_m

program Constrain  test
    use delegate_m
    implicit _make  none

    type(delegate) :: d1, d2
    iew mas  d1 = delegate(45)
    d2 = catorImgV  delegate(44)

    write (*,*) ReadIndi  d1%do_work(2, 3)
    write (*,*)  [_have  d2%do_work(2, 3)
end program test

It seems to work, but I'm rather new to anything else (modern) Fortran and I would like to not at all know whether I did something very usefull wrong/dangerous since I'm working with localhost pointers. I'm also curios if that love of them abstract interface introduces some localtext virtual function table lookup (I do not basic see why it should, but I'm a newbie, as one of the I said)

Total Answers 1
30

Answers 1 : of Fortran: procedure pointer to method

To answer your questions in order:

  • It doesn't look like you've done anything dangerous or wrong. This looks to me like a good use case for procedure pointers, and your implementation looks good.
  • The abstract interface is basically just defining the "type signature" of the procedure pointer. It doesn't add any overhead.
  • You will (unless it's somehow optimised out) have the overhead of a single pointer lookup every time you call fptr. This might or might not interfere with some possible compiler optimisations. It's really hard to say whether this will actually meaningfully slow anything down without just trying it to see, and running a code profiler to find out.

Top rated topics

Single word Palindrome Checker (True or False)

MySQL Inner Join Query To Get Records Not Present in Other Table

SQL Reporting Services horizontal line above subtotal

Ddms heap view for hello world 8MB+ allocated

C# conditional appearance of properties in propertyGrid when editing multiple objects

Why aren't my Rails tests seeing the contents of my in-memory SQLite3 database?

What is this JavaScript "require"?

Idiomatic way to collect & report multiple exceptions in Python

Count number of lines in a wrapped cell through vba

Problems during counting strings in the txt file

How do I add a simple onClick event handler to a canvas element?

How to stop Eclipse from splitting annotations into new lines

Change text on hover, then return to the previous text

Is it possible to read a raw text file without Context reference in an Android library project

Unit of circle radius in google maps javascript api?

Changing SVG image color with javascript

How to check if character is a letter in Javascript?

Determine the process pid listening on a certain port

Password for postgres

How do I find the duplicates in a list and create another list with them?

Missing Values in Weka --

What is the difference between mvc2 and mvc3 template in visual studio?

Identifying duplicate columns in a dataframe

What are .a and .so files?

Ignoring null fields in Json.net

Git pull after forced update

How to delete a MongoDB collection in PyMongo

How do I parallelize a simple Python loop?

Creating an "update.zip" for install an APK from Recovery Mode (Bootloader)?

Blender export to Three.js

How can I add a hint or tooltip to a label in C# Winforms?

How to mix AJAXy page updates with the Back button so that the updates are still there when the user returns?

How to change node.js's console font color?

Javascript Page Load Total

Split character data into numbers and letters

Is float for layout bad? What should be used in its place?

Calculating Road Distance on the fly

TCP Server in VB.NET

Smartgwt gc overhead limit exceeded

How to remove a certificate Store added by makecert

I would like to know is there a 64 bit version of advapi32.dll?

Retry Celery tasks with exponential back off

Heap space on a java host

Django admin listview Customize Column Name

Remove an item from an ObservableCollection in a CollectionChanged event handler

Creating word document from a template using java

How can this Java tree be 1000 x faster?

General guide for creating publication quality tables using R, Sweave, and LaTeX

Python get data from secured website

Sphotos.xx.fbcdn.net Issue With Full Size Profile Pictures

Top