Question

I'm just beginning with Fortran, and I've got a program and a function

PROGRAM  multiplication
    implicit none
    real :: A1

    !A1 = mult(2, 3)
    !write(*,1) A1
    1 format(f8.8)
END PROGRAM multiplication

REAL FUNCTION mult(a, b) BIND(C, name='foomult')
    real,value :: a,b
    mult =  a * b
END FUNCTION

I've got the function working in java through JNA, but when I try to call mult from within the fortran main program, I get a ton of compiling errors (I can provide them if you want). I have a feeling it must be something obvious but I can't find a solution anywhere. Are bound functions not intended to be called from within non-external code? Or do I just have a poor understanding of function syntax?

Was it helpful?

Solution

For the main program, the compiler doesn't "know" the properties of the function, i.e., the types of the function and its arguments. Your function uses an "advanced" argument property, value, so it is necessary to declare the properties in some way to the caller. The easiest way to make those properties known to the caller is to put the function into a module and use that module from a program or procedure that uses it:

module MyModule

contains

FUNCTION mult(a, b) BIND(C, name='foomult')
    use iso_c_binding
    real (c_float) ,value :: a,b
    real (c_float) :: mult
    mult =  a * b
END FUNCTION

end module MyModule

PROGRAM  multiplication
    use MyModule
    implicit none
    real :: A1

    A1 = mult(2.0, 3.0)
    write(*,*) A1
END PROGRAM multiplication

I've also declared the variables in the function to be compatible with C. It happens, at least with gfortran on my computer, that those are the same as plain real, so they are compatible with the call in the main program. Compatibility could be guaranteed by writing the call as mult (2.0_c_float, 3.0_c_float).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top