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
초급자
1,397 조회수

 

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 포인트
1 솔루션
Arjen_Markus
명예로운 기여자 II
1,397 조회수

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 포인트
5 응답
Arjen_Markus
명예로운 기여자 II
1,397 조회수

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

0 포인트
jim_cox
초급자
1,397 조회수

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 포인트
Arjen_Markus
명예로운 기여자 II
1,398 조회수

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 포인트
jimdempseyatthecove
명예로운 기여자 III
1,397 조회수

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 포인트
jim_cox
초급자
1,397 조회수

 

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 포인트
응답