- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Can you show the code? It is very likely a mismatch in the interface as seen from both sides.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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 ;
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page