Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Structure overlay question
Message
De
07/11/1997 20:10:07
 
 
À
07/11/1997 19:04:52
Edward Crawford
City Facilities Management
Glasgow, Royaume Uni
Information générale
Forum:
Visual FoxPro
Catégorie:
Autre
Divers
Thread ID:
00059032
Message ID:
00059035
Vues:
36
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.
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform