Hi there,
I'm baffled by some problems I'm having with the following pack & unpack
routines. As near as I can tell from watching memory in the debugger,
the packing works correctly, but the unpacking doesn't. Specifically,
though the Index, Type, Weight, QuestionareID, and Question values are
all unpacked correctly, the Minimum, Maximum, Default, and Answer values
are all set to 0. It looks like it's only paying attention to the first
of the two bytes that are supposed to make up each of those values.
Here's the code. Any insight is very much appreciated.
Sean
----- CODE BEGINS -----
typedef struct {
UInt16 Index;
UInt16 Type;
UInt16 Weight;
UInt32 QuestionaireID;
const Char *Question;
UInt16 Minimum;
UInt16 Maximum;
UInt16 Default;
UInt16 Answer;
} QuestionSlider;
typedef struct {
UInt16 Index;
UInt16 Type;
UInt16 Weight;
UInt32 QuestionaireID;
Char QuestionData[1];
} QuestionsPacked;
static void UnpackQuestionsAsSlider(QuestionSlider *unpackedRecord,
const QuestionsPacked *packedRecord)
{
const char *s = packedRecord->QuestionData;
UInt16 offset = 0;
offset = sizeof( packedRecord->Index ) + sizeof
( packedRecord->Type ) + sizeof( packedRecord->Weight ) + sizeof
( packedRecord->QuestionaireID );
unpackedRecord->Index = packedRecord->Index;
unpackedRecord->Type = packedRecord->Type;
unpackedRecord->Weight = packedRecord->Weight;
unpackedRecord->QuestionaireID = packedRecord->QuestionaireID;
unpackedRecord->Question = s;
offset += StrLen( s ) + 1;
s += StrLen( s ) + 1;
unpackedRecord->Minimum = *s;
offset += sizeof( unpackedRecord->Minimum );
s += sizeof( unpackedRecord->Minimum );
unpackedRecord->Maximum = *s;
offset += sizeof( unpackedRecord->Maximum );
s += sizeof( unpackedRecord->Maximum );
unpackedRecord->Default = *s;
offset += sizeof( unpackedRecord->Default );
s += sizeof( unpackedRecord->Default );
unpackedRecord->Answer = *s;
offset += sizeof( unpackedRecord->Answer );
s += sizeof( unpackedRecord->Answer );
}
static void PackSlider(QuestionSlider* unpackedRecord, MemHandle
packedRecord)
{
UInt16 length = 0;
Char* s;
UInt16 offset = 0;
const char* srcP;
UInt16 len = 0;
length = sizeof( unpackedRecord->Index ) +
sizeof( unpackedRecord->Type ) +
sizeof( unpackedRecord->Weight ) +
sizeof( unpackedRecord->QuestionaireID ) +
StrLen( unpackedRecord->Question ) + 1 +
sizeof( unpackedRecord->Minimum ) +
sizeof( unpackedRecord->Maximum ) +
sizeof( unpackedRecord->Default ) +
sizeof( unpackedRecord->Answer );
if ( MemHandleResize( packedRecord, length ) == 0 ) {
s = MemHandleLock( packedRecord );
DmWrite( s, offset, &unpackedRecord->Index, sizeof
( unpackedRecord->Index ) );
offset = offset + sizeof( unpackedRecord->Index );
DmWrite( s, offset, &unpackedRecord->Type, sizeof
( unpackedRecord->Type ) );
offset = offset + sizeof( unpackedRecord->Type );
DmWrite( s, offset, &unpackedRecord->Weight, sizeof
( unpackedRecord->Weight ) );
offset = offset + sizeof( unpackedRecord->Weight );
DmWrite( s, offset, &unpackedRecord->QuestionaireID, sizeof
( unpackedRecord->QuestionaireID ) );
offset = offset + sizeof( unpackedRecord->QuestionaireID );
srcP = unpackedRecord->Question;
len = StrLen( srcP ) + 1;
DmWrite( s, offset, srcP, len );
offset = offset + len;
DmWrite( s, offset, &unpackedRecord->Minimum, sizeof
( unpackedRecord->Minimum ) );
offset = offset + sizeof( unpackedRecord->Minimum );
DmWrite( s, offset, &unpackedRecord->Maximum, sizeof
( unpackedRecord->Maximum ) );
offset = offset + sizeof( unpackedRecord->Maximum );
DmWrite( s, offset, &unpackedRecord->Default, sizeof
( unpackedRecord->Default ) );
offset = offset + sizeof( unpackedRecord->Default );
DmWrite( s, offset, &unpackedRecord->Answer, sizeof
( unpackedRecord->Answer ) );
offset = offset + sizeof( unpackedRecord->Answer );
MemHandleUnlock( packedRecord );
}
}
----- CODE ENDS -----
------
Sean McMains ([EMAIL PROTECTED])
AIM: SeanMcTex
http://www.mcmains.net/ruminations/
--
For information on using the Palm Developer Forums, or to unsubscribe, please see
http://www.palmos.com/dev/support/forums/