Hi
Ich entwickle neuerdings mit Borland C++ 2006 und bin auf folgende Merwürdigkeit gestossen. In gewissen Teilen meines Codes kann ich nicht Debuggen. Hier das Code-Snippet:
class ClTestRect
{
public:
TestCOORD left;
TestCOORD top;
TestCOORD right;
TestCOORD bottom;
public:
ClTestRect()
{ left = right = top = bottom = 0;} ClTestRect( ClTestRect &Other)
{ left = Other.left; right = Other.right; top = Other.top; bottom = Other.bottom;}
ClTestRect( TRect &Other)
{ left = Other.left; right = Other.right; top = Other.top; bottom = Other.bottom;}
ClTestRect( TestCOORD Left, TestCOORD Top, TestCOORD Right, TestCOORD Bottom)
{
left = MINCOORD( Left, Right);
right = MAXCOORD( Left, Right);
top = MINCOORD( Top, Bottom);
bottom= MAXCOORD( Top, Bottom);
}
ClTestRect( ClTestPoint &Pt1, ClTestPoint &Pt2)
{
left = MINCOORD( Pt1.x, Pt2.x);
right = MAXCOORD( Pt1.x, Pt2.x);
top = MINCOORD( Pt1.y, Pt2.y);
bottom= MAXCOORD( Pt1.y, Pt2.y);
} operator TRect()
{
TRect Tmp; Tmp.left = left; Tmp.top = top; Tmp.right = right; Tmp.bottom = bottom;
return Tmp;
}
void Reset()
{ left = 0; top = 0; right = 0; bottom = 0;}
// ensures that left is smaller than right and top is smaller than bottom
void RealRect()
{
TestCOORD Tmp;
if( left > right)
{
Tmp = right;
right = left;
left = Tmp;
}
if( top > bottom)
{
Tmp = bottom;
bottom = top;
top = Tmp;
}
}
// Normalizes the rect to left = 0 and top = zero and returns Offset instead
// left and top of the rectangle are added to Offset; so if there is no preset offset
// make sure, that Offset is zero before the call
void NormalizeRectAndOffset( ClTestPoint &Offset)
{
RealRect();
Offset.x += left;
Offset.y += top;
right = right - left;
bottom = bottom - top;
left = 0;
top = 0;
}
inline bool IsEmpty( void)
{
return( (left == right) && (top == bottom));
};
// Adds DX and DY to this
void OffsetRect( TestCOORD DX, TestCOORD DY)
{
left += DX;
right += DX;
top += DY;
bottom += DY;
}
// Adds DPoint to this
void OffsetRect( ClTestPoint DPoint)
{
left += DPoint.x;
right += DPoint.x;
top += DPoint.y;
bottom += DPoint.y;
}
// Dehnt das Rechteck um DX und DY aus in allen Koordinaten
void InflateRect( TestCOORD DX, TestCOORD DY)
{
left -= DX;
right += DX;
top -= DY;
bottom += DY;
}
bool PointInRect( ClTestPoint &P)
{
if( (P.x >= left) && (P.x <= right) && (P.y >= top) && (P.y <= bottom))
return true;
return false;
}
// Widens the rect so that P is within the rect
void Widen( ClTestPoint &P)
{
if( P.x < left)
left = P.x;
if( P.x > right)
right = P.x;
if( P.y < top)
top = P.y;
if( P.y > bottom)
bottom = P.y;
}
// Multiplies left and right by ScaleX, top and bottom by ScaleY
void Scale( TestCOORD ScaleX, TestCOORD ScaleY)
{
left *= ScaleX; right *= ScaleX;
top *= ScaleY; bottom *= ScaleY;
}
// Bildet das Verbundrechteck aus den eigenen Koordinaten und denen von
// R und überschreibt damit die eigenen Koordinaten.
// Diese Fkt. ist sicher sinnvoller als UnionRect!
void SelfUnionRect( ClTestRect &R)
{
if( IsEmpty() && (left == 0))
{ // šbernehme die Koordinaten von R
left = R.left;
right = R.right;
top = R.top;
bottom = R.bottom;
return;
}
if( R.IsEmpty() && (R.left == 0))
{ // behalte die eigenen Koordinaten
return;
}
left = MINCOORD( left, R.left);
right = MAXCOORD( right, R.right);
top = MINCOORD( top, R.top);
bottom = MAXCOORD( bottom, R.bottom);
} // Ende Fkt.
void ToTRect( TRect &Rect)
{
Rect.left = left; Rect.right = right; Rect.top = top; Rect.bottom = bottom;
}
TestCOORD Width()
{ return (right - left) + 1;}
TestCOORD Height()
{ return (bottom - top) + 1;}
};
In den fetten Methoden kann ich debuggen, überall sonst nicht. Warum ist das so? Zuerst habe ich gedacht, es könnte damit zu tun haben, dass der Compiler gewisse Methoden expandiert (da soweit ich weiss Methoden in der Klassdefinition implizit inline Methoden sind), aber gemäss meinen Compilereinstellungen sollten alle inline Funktionen expandiert werden. Ich habe keine Ahnung warum dies nicht funktioniert. Kann mir jemand helfen?
PS: ich bin darauf gestossen, weil ich merkwürdige Floating Point Exceptions habe, evtl. gibt es einen Zusammenhang.
Ich entwickle neuerdings mit Borland C++ 2006 und bin auf folgende Merwürdigkeit gestossen. In gewissen Teilen meines Codes kann ich nicht Debuggen. Hier das Code-Snippet:
class ClTestRect
{
public:
TestCOORD left;
TestCOORD top;
TestCOORD right;
TestCOORD bottom;
public:
ClTestRect()
{ left = right = top = bottom = 0;} ClTestRect( ClTestRect &Other)
{ left = Other.left; right = Other.right; top = Other.top; bottom = Other.bottom;}
ClTestRect( TRect &Other)
{ left = Other.left; right = Other.right; top = Other.top; bottom = Other.bottom;}
ClTestRect( TestCOORD Left, TestCOORD Top, TestCOORD Right, TestCOORD Bottom)
{
left = MINCOORD( Left, Right);
right = MAXCOORD( Left, Right);
top = MINCOORD( Top, Bottom);
bottom= MAXCOORD( Top, Bottom);
}
ClTestRect( ClTestPoint &Pt1, ClTestPoint &Pt2)
{
left = MINCOORD( Pt1.x, Pt2.x);
right = MAXCOORD( Pt1.x, Pt2.x);
top = MINCOORD( Pt1.y, Pt2.y);
bottom= MAXCOORD( Pt1.y, Pt2.y);
} operator TRect()
{
TRect Tmp; Tmp.left = left; Tmp.top = top; Tmp.right = right; Tmp.bottom = bottom;
return Tmp;
}
void Reset()
{ left = 0; top = 0; right = 0; bottom = 0;}
// ensures that left is smaller than right and top is smaller than bottom
void RealRect()
{
TestCOORD Tmp;
if( left > right)
{
Tmp = right;
right = left;
left = Tmp;
}
if( top > bottom)
{
Tmp = bottom;
bottom = top;
top = Tmp;
}
}
// Normalizes the rect to left = 0 and top = zero and returns Offset instead
// left and top of the rectangle are added to Offset; so if there is no preset offset
// make sure, that Offset is zero before the call
void NormalizeRectAndOffset( ClTestPoint &Offset)
{
RealRect();
Offset.x += left;
Offset.y += top;
right = right - left;
bottom = bottom - top;
left = 0;
top = 0;
}
inline bool IsEmpty( void)
{
return( (left == right) && (top == bottom));
};
// Adds DX and DY to this
void OffsetRect( TestCOORD DX, TestCOORD DY)
{
left += DX;
right += DX;
top += DY;
bottom += DY;
}
// Adds DPoint to this
void OffsetRect( ClTestPoint DPoint)
{
left += DPoint.x;
right += DPoint.x;
top += DPoint.y;
bottom += DPoint.y;
}
// Dehnt das Rechteck um DX und DY aus in allen Koordinaten
void InflateRect( TestCOORD DX, TestCOORD DY)
{
left -= DX;
right += DX;
top -= DY;
bottom += DY;
}
bool PointInRect( ClTestPoint &P)
{
if( (P.x >= left) && (P.x <= right) && (P.y >= top) && (P.y <= bottom))
return true;
return false;
}
// Widens the rect so that P is within the rect
void Widen( ClTestPoint &P)
{
if( P.x < left)
left = P.x;
if( P.x > right)
right = P.x;
if( P.y < top)
top = P.y;
if( P.y > bottom)
bottom = P.y;
}
// Multiplies left and right by ScaleX, top and bottom by ScaleY
void Scale( TestCOORD ScaleX, TestCOORD ScaleY)
{
left *= ScaleX; right *= ScaleX;
top *= ScaleY; bottom *= ScaleY;
}
// Bildet das Verbundrechteck aus den eigenen Koordinaten und denen von
// R und überschreibt damit die eigenen Koordinaten.
// Diese Fkt. ist sicher sinnvoller als UnionRect!
void SelfUnionRect( ClTestRect &R)
{
if( IsEmpty() && (left == 0))
{ // šbernehme die Koordinaten von R
left = R.left;
right = R.right;
top = R.top;
bottom = R.bottom;
return;
}
if( R.IsEmpty() && (R.left == 0))
{ // behalte die eigenen Koordinaten
return;
}
left = MINCOORD( left, R.left);
right = MAXCOORD( right, R.right);
top = MINCOORD( top, R.top);
bottom = MAXCOORD( bottom, R.bottom);
} // Ende Fkt.
void ToTRect( TRect &Rect)
{
Rect.left = left; Rect.right = right; Rect.top = top; Rect.bottom = bottom;
}
TestCOORD Width()
{ return (right - left) + 1;}
TestCOORD Height()
{ return (bottom - top) + 1;}
};
In den fetten Methoden kann ich debuggen, überall sonst nicht. Warum ist das so? Zuerst habe ich gedacht, es könnte damit zu tun haben, dass der Compiler gewisse Methoden expandiert (da soweit ich weiss Methoden in der Klassdefinition implizit inline Methoden sind), aber gemäss meinen Compilereinstellungen sollten alle inline Funktionen expandiert werden. Ich habe keine Ahnung warum dies nicht funktioniert. Kann mir jemand helfen?
PS: ich bin darauf gestossen, weil ich merkwürdige Floating Point Exceptions habe, evtl. gibt es einen Zusammenhang.
Comment