Hello!
The problem seems to be that the funtion PickSeedsForSplit found in
mitab_mapindexblock.cpp internally tries to divide by zero, around line 1050.
If I add the following lines the problem is solved, but is this OK??
if(nSrcHeight == 0) { nSrcHeight = 1; }
if(nSrcWidth == 0) { nSrcWidth = 1; }Best RegardsMikael Larsson
To: [EMAIL PROTECTED]: [EMAIL PROTECTED]: Tue, 18 Nov 2008 22:02:49
+0000Subject: RE: [mitab] catching exceptions from the mitab library.
Hello again!I have tried to isolate the core of my code. It is quite a few
lines so bear with me.I get an exception when I call the mitab_c_write_feature
method. I does not happen always, and not even very often but sometimes.Could
this be something wrong with my file. How do I check?Best Regards Mikael
Larsson num_fields = mitab_c_get_field_count(input_dataset); //
Iterate through the fields, copying them to the output for(iFieldNumber = 0;
iFieldNumber < num_fields; iFieldNumber++) {
mitab_c_add_field(output_dataset,
mitab_c_get_field_name(input_dataset, iFieldNumber),
mitab_c_get_field_type(input_dataset, iFieldNumber),
mitab_c_get_field_width(input_dataset, iFieldNumber),
mitab_c_get_field_precision(input_dataset, iFieldNumber), 0, 0); }
int num_parts,nStat,nOldStat=0; // Now for all features in the source
file.... int iNumberObjects = 0; // To hold the number of features
transformed for( input_feature_id =
mitab_c_next_feature_id(input_dataset,-1); input_feature_id != -1;
input_feature_id = mitab_c_next_feature_id(input_dataset,input_feature_id) )
{ mitab_feature input_feature; mitab_feature output_feature;
// Read next feature object input_feature =
mitab_c_read_feature(input_dataset, input_feature_id); if(input_feature
== NULL) { char buffer[20]; _itoa(
input_feature_id, buffer, 10 ); CString strFeatureNumber(buffer);
strLogg = strLogg + "När objekt nummer " + strFeatureNumber + " skulle
läsas från tabellen uppstod ett fel. Objektet verkar vara tomt.\r\n";
continue; } // Create output feature
output_feature = mitab_c_create_feature(output_dataset,
mitab_c_get_type(input_feature)); if(output_feature == NULL) {
char buffer[20]; _itoa( input_feature_id, buffer, 10 );
CString strFeatureNumber(buffer); strLogg = strLogg + "När
objekt nummer " + strFeatureNumber + " skulle läsas från tabellen uppstod ett
fel. Objektet verkar vara tomt.\r\n"; // Destroy the feature object
mitab_c_destroy_feature(output_feature);
mitab_c_destroy_feature(input_feature); continue; }
int iFeatureType = mitab_c_get_type(input_feature);
if(iFeatureType == 6) { strLogg = strLogg + "Varning! Ett
objekt av typen: Båge har påträffats. Detta objekt kan inte transformeras och
kommer att hoppas över.\r\n"; if(!stSTTrans->bSilent) {
wndProgress.SetLoggText(strLogg); } //
Destroy the feature object mitab_c_destroy_feature(output_feature);
mitab_c_destroy_feature(input_feature); continue; }
if(iFeatureType == 8) { strLogg = strLogg + "Varning!
Ett objekt av typen: Rektangel har påträffats. Detta objekt kan inte
transformeras och kommer att hoppas över.\r\n";
if(!stSTTrans->bSilent) {
wndProgress.SetLoggText(strLogg); } // Destroy the
feature object mitab_c_destroy_feature(output_feature);
mitab_c_destroy_feature(input_feature); continue;
} if(iFeatureType == 9) { strLogg = strLogg +
"Varning! Ett objekt av typen: Elips har påträffats. Detta objekt kan inte
transformeras och kommer att hoppas över.\r\n";
if(!stSTTrans->bSilent) {
wndProgress.SetLoggText(strLogg); } // Destroy the
feature object mitab_c_destroy_feature(output_feature);
mitab_c_destroy_feature(input_feature); continue;
} // Set the feature symbol properties // Only valid for
point and multipoint if(iFeatureType == 1 || iFeatureType == 10)
{ mitab_c_set_symbol(output_feature,
mitab_c_get_symbol_no(input_feature), mitab_c_get_symbol_size(input_feature),
mitab_c_get_symbol_color(input_feature)); } // Set the
feature text properties // Only vaild for text // Also set the
text itself if(iFeatureType == 4) {
mitab_c_set_text_display(output_feature,
mitab_c_get_text_angle(input_feature),
mitab_c_get_text_height(input_feature),
mitab_c_get_text_width(input_feature),
mitab_c_get_text_fgcolor(input_feature),
mitab_c_get_text_bgcolor(input_feature),
mitab_c_get_text_justification(input_feature),
mitab_c_get_text_spacing(input_feature),
mitab_c_get_text_linetype(input_feature));
mitab_c_set_text(output_feature, mitab_c_get_text(input_feature));
} // Set the feature brush properties // Applies to
region, ellipse and rectangle objects if(iFeatureType == 7 ||
iFeatureType == 8) { mitab_c_set_brush(output_feature,
mitab_c_get_brush_fgcolor(input_feature),
mitab_c_get_brush_bgcolor(input_feature),
mitab_c_get_brush_pattern(input_feature),
mitab_c_get_brush_transparent(input_feature)); } // Set
the feature font properties // Only valid for TABFC_Text or
TABFC_FontPoint if(iFeatureType == 2 || iFeatureType == 4) {
mitab_c_set_symbol(output_feature, mitab_c_get_symbol_no(input_feature),
mitab_c_get_symbol_size(input_feature),
mitab_c_get_symbol_color(input_feature));
mitab_c_set_symbol_angle(output_feature,
mitab_c_get_text_angle(input_feature));
mitab_c_set_font(output_feature, mitab_c_get_font(input_feature));
mitab_c_set_fontstyle(output_feature, mitab_c_get_fontstyle(input_feature,
bolIsMIF), bolIsMIF); } // Set the feature pen properties
// Only valid for polyline, region, rectangle, arc and ellipse objects
if(iFeatureType == 5 || iFeatureType == 7 || iFeatureType == 8) {
mitab_c_set_pen(output_feature,
mitab_c_get_pen_width(input_feature),
mitab_c_get_pen_pattern(input_feature),
mitab_c_get_pen_color(input_feature)); } // Read the
feature attributes for(iFieldNumber = 0; iFieldNumber < num_fields;
iFieldNumber++) { mitab_c_set_field(output_feature,
iFieldNumber, mitab_c_get_field_as_string(input_feature, iFieldNumber));
} bool bOnePointPolyline = false; for(int partno = 0; partno <
num_parts; partno++) { int num_points =
mitab_c_get_vertex_count(input_feature, partno); if(num_points == 1
&& iFeatureType == 5) { bOnePointPolyline
= true; break; } int
iValidPoints = 0; int iInValidPoints = 0; for(int pointno
= 0; pointno < num_points; pointno++) { if(pointno >=
m_allocSize) { m_allocSize = m_allocSize +
25; m_dblXInputCoord = (double *)
realloc(m_dblXInputCoord,m_allocSize*sizeof(double));
m_dblYInputCoord = (double *)
realloc(m_dblYInputCoord,m_allocSize*sizeof(double)); }
bValidCoord = TransformOne(stSTTrans,
inSystemStruct,
utSystemStruct,
mitab_c_get_vertex_x(input_feature, partno, pointno),
mitab_c_get_vertex_y(input_feature, partno, pointno),
&m_dblXInputCoord[pointno],
&m_dblYInputCoord[pointno]); }
mitab_c_set_points(output_feature, partno, num_points, m_dblXInputCoord,
m_dblYInputCoord); } if(bOnePointPolyline) {
strLogg = strLogg + "Varning! En polyline med endast en punkt har påträffats.
Objektet har ignorerats i transformationen.\r\n";
if(!stSTTrans->bSilent) {
wndProgress.SetLoggText(strLogg); } //
Destroy the feature object mitab_c_destroy_feature(output_feature);
mitab_c_destroy_feature(input_feature);
continue; } // Fails here...
mitab_c_write_feature(output_dataset, output_feature);
// Destroy the feature object mitab_c_destroy_feature(output_feature);
mitab_c_destroy_feature(input_feature); iNumberObjects++;
m_allocSize = 25; m_dblXInputCoord = (double *)
realloc(m_dblXInputCoord,m_allocSize*sizeof(double)); m_dblYInputCoord =
(double *) realloc(m_dblYInputCoord,m_allocSize*sizeof(double));
} // Close input and output file mitab_c_close(input_dataset);
mitab_c_close(output_dataset);
To: [EMAIL PROTECTED]: [EMAIL PROTECTED]: Tue, 21 Oct 2008 16:58:27
-0700Subject: RE: [mitab] catching exceptions from the mitab library.
And here's the minimal example to create a TAB file. It seems as though you
have to have at least one field for Mitab to output a valid TAB file that
MapInfo can read!
mitab_handle hTAB = mitab_c_create("C:\\tmp\\test.tab","tab","CoordSys Earth
Projection 1, 0",-32.0,-34.0,152.0,150.0);
if (hTAB!=NULL)
{
int nField = mitab_c_add_field(hTAB,"Test",TABFT_Integer,0,0,0,0);
double xs[1];
double ys[1];
xs[0] = 151.0; ys[0] = -33.0;
mitab_feature hFeature;
hFeature = mitab_c_create_feature(hTAB,TABFC_Point);
mitab_c_set_field(hFeature,nField,"1");
mitab_c_set_points(hFeature,0,1,xs,ys);
mitab_c_write_feature(hTAB,hFeature);
mitab_c_destroy_feature(hFeature);
xs[0] = 151.1; ys[0] = -33.1;
hFeature = mitab_c_create_feature(hTAB,TABFC_Point);
mitab_c_set_field(hFeature,nField,"2");
mitab_c_set_points(hFeature,0,1,xs,ys);
mitab_c_write_feature(hTAB,hFeature);
mitab_c_destroy_feature(hFeature);
}
mitab_c_close(hTAB);
--- On Tue, 21/10/08, Mikael Larsson <[EMAIL PROTECTED]> wrote:
From: Mikael Larsson <[EMAIL PROTECTED]>Subject: RE: [mitab] catching
exceptions from the mitab library.To: [EMAIL PROTECTED]: Tuesday, 21 October,
2008, 5:55 AM
Yes, but that does not work for me. I never enter the catch-part, I still get
a crash on the same line of code.
To: [EMAIL PROTECTED] comFrom: [EMAIL PROTECTED] .comDate: Mon, 20 Oct 2008
14:42:29 -0700Subject: Re: [mitab] catching exceptions from the mitab library.
Have you tried adding a try { .... } catch (..) { } block around the call that
crashes ?--- On Sun, 19/10/08, Mikael Larsson <[EMAIL PROTECTED] com> wrote:
From: Mikael Larsson <[EMAIL PROTECTED] com>Subject: [mitab] catching
exceptions from the mitab library.To: [EMAIL PROTECTED] comReceived: Sunday, 19
October, 2008, 9:52 PM
Hello!I'm writing a software to convert a file from one coordinate system to
another. I do this by reading the different objects from the file with the
available functions, transform the coordinates and write back the object to a
new output file.For one input file I get an exception when calling the
mitab_c_write_ feature function. The exception originates in the function
PickSeedsForSplit found in the file mitab_mapindexblock .cpp. The problem seems
to be that nSrcHeight or nSrcWidth can be equal to zero. Then the division on
line 1065 will not work and an exception is thrown.Is there any way to catch
this exception in my MFC application? I would very much like to avoid a
software crash because of this.I'm using the latest version (1.7.0). Can anyone
please advise? Best RegardsMikael Larsson
Connect to the next generation of MSN Messenger Get it now! Send instant
messages to your online friends http://au.messenger .yahoo.com
Explore the seven wonders of the world Learn more!
Make the switch to the world's best email. Get Yahoo!7 Mail.
Connect to the next generation of MSN Messenger Get it now!
_________________________________________________________________
News, entertainment and everything you care about at Live.com. Get it now!
http://www.live.com/getstarted.aspx