Hi Frank,
You quite right, what
It is not clear to me why this should be necessary. osAcronym is a
long lived std::string (well CPLString derived from std::string)
living in the registrars attribute list. I assume the following
method is used to convert the CPLString to "const char *" which
should amount to the same thing you did.
but this is not helps, as c_str() method of std::string not return
pointer, but construct new zero ended const char* managed by std::string
(maybe this is specific to VS2010-VS2013). This const char* cleared
after some call to std::string or CPLString and we got empty (cleared)
const char *pszAcronym. I think the VS2010-VS2013 compiler do this in
getter by index, operator const char* or the whole GetAttrInfo(i) ==
NULL ? NULL : aoAttrInfos[i]->osAcronym (maybe MS change the order
parameter calculation or optimization). Maybe const (operator const
char* (void) const) in non const (const char *GetAttrAcronym( int i ))
function VS2010-VS2013 specific behaviour.
OK, I fire the ticket. As I have committer rights, my I add changes,
corresponding to the ticket?
Best regards,
Dmitry
05.12.2013 0:19, Frank Warmerdam пишет:
Dmitriy,
It is not clear to me why this should be necessary. osAcronym is a
long lived std::string (well CPLString derived from std::string)
living in the registrars attribute list. I assume the following
method is used to convert the CPLString to "const char *" which should
amount to the same thing you did.
operator const char* (void) const { return c_str(); }
Perhaps there is some subtle reason I don't see that the compiler is
creating a temporary std::string in between?
In any event, if you file a ticket I can apply this change upstream.
There are other accessors on the same class that look like they could
have similar issues.
Best regards,
Frank
On Wed, Dec 4, 2013 at 12:11 PM, Dmitriy Baryshnikov
<bishop....@gmail.com <mailto:bishop....@gmail.com>> wrote:
Hi,
I have such error: the GDAL compiled with VS2010-VS2013 in s57
driver loose all additional fields values. But the same code
compiled with gcc or previous VS works fine.
I found the root of problems here
(ogr\ogrsf_frmts\s57\s57reader.cpp:932):
const char *pszAcronym = poRegistrar->GetAttrAcronym(nAttrId);
iField = poFeature->GetDefnRef()->GetFieldIndex(pszAcronym);
The pszAcronym always empty.
The problem comes from this function (ogr\ogrsf_frmts\s57\s57.h:140):
const char *GetAttrAcronym( int i )
{ return GetAttrInfo(i) == NULL ? NULL :
aoAttrInfos[i]->osAcronym; }
It seems to me that during execution this function I have
|situation when||c_str()|result becomes invalid
(the|std::string|is destroyed or a non-const member function of
the string is called).
If I change function
const char *GetAttrAcronym( int i )
{ return GetAttrInfo(i) == NULL ? NULL :
aoAttrInfos[i]->osAcronym.c_str(); }
the problem gone.
So I need some confirmation/verification my ideas.
If I'm right, I can make changes to s57 driver.
Best regards,
Dmitry
------------------------------------------------------------------------
<http://www.avast.com/>
Это сообщение свободно от вирусов и вредоносного ПО благодаря
avast! Antivirus <http://www.avast.com/> защита активна.
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org <mailto:gdal-dev@lists.osgeo.org>
http://lists.osgeo.org/mailman/listinfo/gdal-dev
--
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up | Frank Warmerdam,
warmer...@pobox.com <mailto:warmer...@pobox.com>
light and sound - activate the windows | http://pobox.com/~warmerdam
<http://pobox.com/%7Ewarmerdam>
and watch the world go round - Rush | Geospatial Software Developer
---
Это сообщение свободно от вирусов и вредоносного ПО благодаря защите от вирусов
avast!
http://www.avast.com
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev