Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Structure overlay question
Message
From
07/11/1997 20:10:07
 
 
To
07/11/1997 19:04:52
Edward Crawford
City Facilities Management
Glasgow, United Kingdom
General information
Forum:
Visual FoxPro
Category:
Other
Miscellaneous
Thread ID:
00059032
Message ID:
00059035
Views:
31
Your code is correct. The problem is a code generation setting. Go to the Project/Settings... in the menu. In the dialog box, choose C/C++ folder, Category: Code generation. In the textbox for Struct member alignment: 2 byte.

This will align the members in structures at 2 bytes. In fact, you can use, as well, 1 byte. But, IMHO, you better let it as default and write your code independent of this setting. Why do you need to overlap the structure? Do you really need that buffer? Can't you use just the structure?

BTW, this is not Windows NT, but straight C. I think we should move to the C/C++ forum, isn't it? :)

Vlad

>Paul,
>I am relatively new to the Windows NT world and I am sure these is a simple explaination for this, but I haven't found it yet. I have a buffer and want to parse it by using a structure; for example:
>#include
>#include
>typedef struct {
> unsigned short port; // 2 bytes, right?
> struct in_addr ip_addr; // 4 bytes
>} address;
>
>void main () {
> char buff[20];
> address *addrPtr;
> unsigned short thePort;
> unsigned long theAddr;
>
> memset (buff, '\0', 20);
> buff[0] = (unsigned char)0x9A;
> buff[1] = (unsigned char)0x10;
> buff[2] = (unsigned char)0xCF; // 2nd octet
> buff[3] = (unsigned char)0xAD; // 1st octet
> buff[4] = (unsigned char)0xD5; // 4th
> buff[5] = (unsigned char)0x74; // 3rd
> buff[6] = (unsigned char)0x0B; // shouldn't see
> buff[7] = (unsigned char)0x16; // shouldn't see
>
> addrPtr = (address *) buff; // overlay the structure
> thePort = addrPtr->port;
> theAddr = addrPtr->ip_addr.s_addr;
> printf ("Port = %hd \n", thePort);
> printf ("Address = %d.%d.%d.%d \n", addrPtr->ip_addr.s_net, addrPtr->ip_addr.s_host, addrPtr->ip_addr.s_lh, addrPtr->ip_addr.s_impno);
>}
>When I run this, I am able to get the Port number OK, but the ip_addr portion is always 2 bytes off. Using the debugger shows the following in memory:
>9A 10 CF AD D5 74 0B 16
> ^
> The addrPtr->ip_addr.s_addr points here to 'D5'; why doesn't it point to 'CF'???
>I am using MS Visual C++ 5.0 on NT 4.0 (Service Pack 3)
>Thanks for the help.
Previous
Reply
Map
View

Click here to load this message in the networking platform