Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

problem with function returns from c++

jim_cox
Beginner
565 Views

 

Hopefully this should be easy...

I'm using fortran to call a c++ function.

This function returns the value 2 as a long - debugging shows this being set 

But when it comes back into my integer4 fortran variable I see the return value as -2147483648

Any thoughts about what might be going wrong?

Very grateful for any assistance.

 

 

 

 

0 Kudos
1 Solution
Arjen_Markus
Honored Contributor I
565 Views

But does the Fortran compiler "know" that SIDGETLANECT is an integer function?

If you do not declare it as such, via an interface block for instance, the default typing rules kick in an the function will be considered to return a floating-point number.

Try:

interface

    integer function SIDGETLANECT(origin)

           integer, value :: origin

    end function

end interface

or the like

View solution in original post

0 Kudos
5 Replies
Arjen_Markus
Honored Contributor I
565 Views

Can you show the code? It is very likely a mismatch in the interface as seen from both sides.

0 Kudos
jim_cox
Beginner
565 Views

fortran looks like:

INTEGER*4 LNS  

LNS = SIDGETLANECT(%val(J2))

c++


long __stdcall SIDGETLANECT(long origin)
{
    CComPtr<ISIAPILegs> legs = NULL;
    CComPtr<ISIAPILeg> leg = NULL;
    CComPtr<ISIAPILaneApproachs> laneApprs = NULL;
    CComPtr<ISIAPILaneApproach> laneAppr = NULL;
    long b;

    site->get_Legs(&legs);
    legs->get_Count(&b);

    leg = NULL;

    legs->get_Item(long (origin - 1) , &leg);

    if (leg == NULL) return 0;
    else
    {
        long laneApprCount, laneno;
        VARIANT_BOOL laneDisciplineExisting = false;

        leg->get_LaneApproachs(&laneApprs);
        laneApprs->get_Count(&laneApprCount);

        return laneApprCount ;
    
    }
}

 

0 Kudos
Arjen_Markus
Honored Contributor I
566 Views

But does the Fortran compiler "know" that SIDGETLANECT is an integer function?

If you do not declare it as such, via an interface block for instance, the default typing rules kick in an the function will be considered to return a floating-point number.

Try:

interface

    integer function SIDGETLANECT(origin)

           integer, value :: origin

    end function

end interface

or the like

0 Kudos
jimdempseyatthecove
Honored Contributor III
565 Views

You should also declare the C++ function as

extern "C" { long SIDGETLANECT(long origin); } // function prototype

See the IVF documentation: C/C++ Naming Conventions.
See also section under BIND

Jim Dempsey

0 Kudos
jim_cox
Beginner
565 Views

 

Sorry, its after midnight here and I probably should have also mentioned that

the c++ function is in a separate library

and

that it has a .h function declaration

extern "C" long __stdcall SIDGETLANECT(long origin);

I will take a look at the interface definition in the morning

Thanks for your input

Jim

 

0 Kudos
Reply