[Shapelib] DBFReadStringAttribute broken?

Frank Warmerdam warmerdam at pobox.com
Thu Mar 20 08:48:27 PDT 2008


Ian Wright wrote:
> I'm wondering if anyone can provide me with some assistance? I'm trying 
> to use the DBFReadStringAttribute method to
> read from my DBF fill but am getting some unusal problems. I'm fairly 
> new to C/C++ development and am not sure if this
> suggests a memory leak or not, and was wondering if anyone could just 
> point me in the right direction.
> 
> Basicaly my variables in my program are becoming corrupt and containing 
> garbage instead of what they should contain
> at random points within my program. I've stripped it right down and 
> believe that it is the DBFReadStringAttribute thats
> causing the problem.
> 
> My code is as follows:
> 
> #ifdef WIN32
> #include <windows.h>
> #endif
> 
> #include <iostream>
> #include "shapefil.h"
> #include <string>
> 
> using namespace std ;
> 
> int main (int argc, char **argv)
> {
>    DBFHandle hDBF = DBFOpen( "c:/not_backed_up/RouteFinda/Unclassified 
> Roads_polyline.dbf", "rb" );
>    if( hDBF != NULL )
>    {
>        char* readName;
> 
>        for (int i = 0; i < 684; i++)
>        {
>            readName = (char*) DBFReadStringAttribute(hDBF, 0, 3) ;
>            cout << i << ":" << readName << endl;
>        }
>    }
>      return 0 ;
> }
> 
> Obviously this should read the same record over and over, 684 times. The 
> actual output I get however is:
> 
> 0:ENG
> 1:ENG
> 2:ENG
> 3:ENG
> 4:ENG
> 5:ENG
> 6:ENG
> 7:ENG
> 8:ENG
> 9:ENG
> 10:ENG
> 11:ENG
> 12:ENG
> 13:ENG
> 14:ENG
> 15:ENG
> 273185792:ENG
> 
> If I remove the DBFReadStringAttribute its fine and will run right 
> through to the end. In my previous program my char*s and arrays
> which has used strcpy to keep the values were becoming corrupt at random 
> points like calling atan2(0,0) for example. This problem
> is only apparent on my windows machine, and seems to run fine in Unix. 
> As a note I have tried changing readName to both a const char *
> and a string, while removing the cast of the DBFReadStringAttribute 
> result but this hasn't made any difference.

Ian,

I don't see why this is happening.  I would however suggest you update to the
current shapelib code.  There is code that is likely more recent in:

   http://download.osgeo.org/shapelib/shapelib_1_2_10.zip

However, I have also taken the liberty of packaging the latest development
code and posting it as:

   http://download.osgeo.org/shapelib/shapelib-1.3.0a1.zip

Try with updated code and see if the problem persists.   If it does, then you
should learn to use your debugger, build the dbfopen.c code with debug, and
step through the time "i" becomes corrupted to see what is going on.

Best regards,
-- 
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up   | Frank Warmerdam, warmerdam at pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush    | President OSGeo, http://osgeo.org




More information about the Shapelib mailing list