Stefan,
Why are you so much afraid about using cast ? ;-) This is probably the
easiest solution for you :
OGRCoordinateTransformation* poCT =
OGRCreateCoordinateTransformation(poSRS1, poSRS2);
OCTDestroyCoordinateTransformation( (OGRCoordinateTransformationH) poCT);
No worry to have. It's exactly the kind of casts done in GDAL/OGR C API
wrappers to call the C++ API.
For example :
OGRCoordinateTransformationH CPL_STDCALL OCTNewCoordinateTransformation(
OGRSpatialReferenceH hSourceSRS, OGRSpatialReferenceH hTargetSRS )
{
return (OGRCoordinateTransformationH)
OGRCreateCoordinateTransformation( (OGRSpatialReference *) hSourceSRS,
(OGRSpatialReference *) hTargetSRS );
}
void CPL_STDCALL OCTDestroyCoordinateTransformation(
OGRCoordinateTransformationH hCT )
{
delete (OGRCoordinateTransformation *) hCT;
}
Otherwise, as you've noted, the stricter typing is only enforced when DEBUG
is defined.
So your code should compile without any change if you don't define DEBUG.
The fundamental issue in fact is that you're mixing use of C++ API and C
API.
A pure C solution would be to use the pair
OCTNewCoordinateTransformation()/OCTDestroyCoordinateTransformation().
For the C++ part, we could argue there's a lack of a static void
OGRCoordinateTransformation::Destroy(OGRCoordinateTransformation*) method
to avoid using the delete operator, which can be an issue on Windows.
----- Original Message -----
From: "Stefan Moebius" <[email protected]>
To: <[email protected]>
Sent: Wednesday, August 05, 2009 5:59 PM
Subject: [gdal-dev] Question on OGR handle types
Hi,
In May 2008, a couple of changes where made to improve type checking.
See http://lists.osgeo.org/pipermail/gdal-dev/2008-May/017059.html
http://trac.osgeo.org/gdal/changeset/14435
http://trac.osgeo.org/gdal/changeset/14441
Our code is using the function
OGRCoordinateTransformation* OGRCreateCoordinateTransformation
(OGRSpatialReference * poSource,
OGRSpatialReference * poTarget)
and with the upgrade from 1.5 to 1.6, we now cannot properly destroy the
OGRCoordinateTransformation anymore (at least in debug mode).
The documentation of that create function says:
Create transformation object.
This is the same as the C function OCTNewCoordinateTransformation().
Input spatial reference system objects are assigned by copy (calling
clone() method) and no ownership transfer occurs.
The delete operator, or OCTDestroyCoordinateTransformation() should be
used to destroy transformation objects.
As we are linking the GDAL dynamically, using delete is not really an
option as we cannot predict what heap was used to create the object. The
destroy function, however, requires a parameter of type
OGRCoordinateTransformationH, which we cannot cleanly cast to anymore for
that change mentioned at the beginning.
What are we missing here? How is this supposed to be used?
Any help is appreciated.
Regards,
Stefan
--
Stefan Möbius
Development Manager
Actix GmbH
Altmarkt 10
01067 Dresden
Germany
T +49 351 40429 17
www.actix.com
_______________________________________________
gdal-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/gdal-dev
_______________________________________________
gdal-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/gdal-dev