C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problem with char type in structures (MSVC)

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
h79
Guest





PostPosted: Sat Aug 28, 2004 12:25 pm    Post subject: Problem with char type in structures (MSVC) Reply with quote



Hi everyone.

I've got a little problem...
I'll try illustrate it on example.

////////////
typedef unsigned long DWORD;
typedef unsigned char BYTE;

struct TST
{
BYTE a, b, c;
DWORD d;
};

int main()
{
ifstream *h_in;
TST s_tst;

h_in = new ifstream("tst.bin", ios::in | ios::binary |
ios::nocreate);
h_in->read((char*)&s_tst, sizeof(TST));
// 004010F0 6A 08 push 8 ; <- why 8, not 7 ?
// 004010F2 8D 45 E8 lea eax,[ebp-18h]
// 004010F5 50 push eax
// 004010F6 8B 4D F0 mov ecx,dword ptr [ebp-10h]
// 004010F9 E8 32 0A 00 00 call istream::read
(00401b30)

cout << hex << (int)s_tst.a << endl;
// printed: '1' <- OK
cout << hex << (int)s_tst.b << endl;
// printed: '2' <- OK
cout << hex << (int)s_tst.c << endl;
// printed: '3' <- OK
cout << hex << s_tst.d << endl;
// printed: 'cc000000' <- ERROR: should be '4'

delete h_in;
return 0;

}

//////////////

Below is the body of file 'tst.bin':

00000000|01 02 03 04-00 00 00

It's length is equal to 7.

Questions are:
1) Why offset of 'd' member i structure 'TST' is equal to 4, not 3?
2) What add in source code or change in project settings to fix it
(i.e. offset of 'd' member be equal 3)?

I want add that this problem apear in MSVC++, but doesn't apear in
Borland C++ compiler where builded program work fine.

Thanks
Harnas
Back to top
David Hilsee
Guest





PostPosted: Sat Aug 28, 2004 3:58 pm    Post subject: Re: Problem with char type in structures (MSVC) Reply with quote



"h79" <h79 (AT) interia (DOT) pl> wrote

Quote:
Hi everyone.

I've got a little problem...
I'll try illustrate it on example.

////////////
typedef unsigned long DWORD;
typedef unsigned char BYTE;

struct TST
{
BYTE a, b, c;
DWORD d;
};

int main()
{
ifstream *h_in;
TST s_tst;

h_in = new ifstream("tst.bin", ios::in | ios::binary |
ios::nocreate);
h_in->read((char*)&s_tst, sizeof(TST));
// 004010F0 6A 08 push 8 ; <- why 8, not 7 ?
// 004010F2 8D 45 E8 lea eax,[ebp-18h]
// 004010F5 50 push eax
// 004010F6 8B 4D F0 mov ecx,dword ptr [ebp-10h]
// 004010F9 E8 32 0A 00 00 call istream::read
(00401b30)

cout << hex << (int)s_tst.a << endl;
// printed: '1' <- OK
cout << hex << (int)s_tst.b << endl;
// printed: '2' <- OK
cout << hex << (int)s_tst.c << endl;
// printed: '3' <- OK
cout << hex << s_tst.d << endl;
// printed: 'cc000000' <- ERROR: should be '4'

delete h_in;
return 0;

}

//////////////

Below is the body of file 'tst.bin':

00000000|01 02 03 04-00 00 00

It's length is equal to 7.

Questions are:
1) Why offset of 'd' member i structure 'TST' is equal to 4, not 3?
2) What add in source code or change in project settings to fix it
(i.e. offset of 'd' member be equal 3)?

I want add that this problem apear in MSVC++, but doesn't apear in
Borland C++ compiler where builded program work fine.

The compiler may insert padding in structs to align the members properly.
If you want to change the compiler's behavior, consult its documentation or
a more appropriate newsgroup that discusses your compiler. I wouldn't
bother to change the compiler's settings, because changing the code would be
an easy solution that wouldn't require revisiting this problem later on
other compilers.

h_in->read((char*)&s_tst, sizeof(TST));

// Read each member instead
h_in->read((char*)&s_tst.a, sizeof(BYTE));
h_in->read((char*)&s_tst.b, sizeof(BYTE));
h_in->read((char*)&s_tst.c, sizeof(BYTE));
h_in->read((char*)&s_tst.d, sizeof(DWORD));

--
David Hilsee



Back to top
h79
Guest





PostPosted: Mon Aug 30, 2004 9:53 am    Post subject: Re: Problem with char type in structures (MSVC) Reply with quote



Thanks.

Today I found also another solution about this problem (I think so).
It depends on use '#pragma pack' option. I used '#pragma pack(1)'.
After using this option all members in structures should be stored on
1-byte boundaries. For me it works fine.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.