At 16:42 2003-3-19 -0800, you wrote:
After some futher testing and stepping through the code, we've noticed that
when the string::t0 is copied from another string::t0 that the full
string::t2 structure was not copied, therfore missing the final element of
string::t2.data_ (null term character)  So whatever information that was
there prior to the copy, it stayed there (in some cases a luck null char,
other times a random byte).

After surround the two structures with a pragma pack 1 (since the short_size
is a bit field), it seems to have fixed the problem.  Now my problem is
(basically UI in the debugger or some existing type library that is being
used by the debugger) that when viewing this data in the debug watch window,
the short_size structure still appears as two bytes. therefore making it
appear as if I have truncated the start of my data_, but when you look in
memory, all is well. (hence if I set a lpcstr to the string.c_str() of this
object, the value is correct.).

Is there anything I can do to correct the debugger problem?
Any help would be Greatly! appreciated..

Hmmm... this version of STL was developed on 32-bit machines (Win32 and Mac OS PowerPC), so its possible that the 16-bit int case wasn't tested well. I think I've found the bug in the code, thanks to your helpful diagnosis.


The basic_string union is defined raw_t, short_t, and long_t.

static const size_type n_words = sizeof(short_t) > sizeof(long_t) ?
sizeof(short_t) / sizeof(size_type) :
sizeof(long_t) / sizeof(size_type);


        struct raw_t
        {
                size_type words_[n_words];
        };

The problem is that division rounds down, so the size of raw_t may be too small. size_type is 32-bits, but if the larger of the short_t and long_t structures isn't evenly divisible by 32-bits, then raw_t will be defined too small.

The solution: change the n_words definition to be:

static const size_type n_words = sizeof(short_t) > sizeof(long_t) ?
(sizeof(short_t) + sizeof(size_type) - 1) / sizeof(size_type) :
(sizeof(long_t) + sizeof(size_type) - 1) / sizeof(size_type);


--
Ben Combee <[EMAIL PROTECTED]>
CodeWarrior for Palm OS technical lead
Palm OS programming help @ www.palmoswerks.com



-- For information on using the Palm Developer Forums, or to unsubscribe, please see http://www.palmos.com/dev/support/forums/

Reply via email to