We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
This code generate 2 bugs:
#define BUG_TEST 0 typedef char * PCHAR; typedef struct { int I; int J; } A_OLD; typedef struct { int nI; int nJ; } A, *PA; typedef A xdata * PAx; A_OLD cAOld; #if BUG_TEST == 0 //Normal int l1 = (PCHAR)&(*(PA)(&cAOld)); //Get address of struct int l2 = ((PCHAR)&((*(PA)(&cAOld)).nI) - (PCHAR)&(*(PA)(&cAOld))); //Calc offset of member #elif BUG_TEST == 1 //Cann't initialize int l1 = (PCHAR)&(*(PAx)(&cAOld)); //Get address of struct #elif BUG_TEST == 2 //General fault C51 int l2 = (unsigned int)((PCHAR)&((*(PA)(&cAOld)).nI) - (PCHAR)&(*(PA)(&cAOld)));//Calc offset of member #endif
I frequently have the same problem. Here is an example of a header file that I use for generating IDs of text strings that are array subscripts to a table of text messages (which may need translation to other languages). The same method can be used with 'offsetof' to generate a table of indexes.
// +--------------------------------------------------------------------------+ // | TxtTable.h | // | | // | If "InModTxtTable" is defined, initializations are performed. To use | // | this feature, "include" the file twice. The first time before the | // | definition of "InModTxtTable", the second time after the definition. | // | | // +--------------------------------------------------------------------------+ #ifdef _txttableh #ifdef InModTxtTable #undef _txttableh #endif #endif #ifndef _txttableh #define _txttableh #ifdef InModTxtTable #define TxtItem(Id, Text) Text code char code *TxtString[] = { #else #define TxtItem(Id, Text) Id enum TextStringIds { #endif /* -- Text Strings for language conversion -------------------------------- */ TxtItem ( tidOpErrBase, "NoneDetected" ), TxtItem ( tidMemFailure, "RAM Failure" ), TxtItem ( tidSigFailure, "Params Reset" ), TxtItem ( tidE2MemoryErr, "E2 Mem Fail" ), TxtItem ( tidLocalHBusErr, "Loc Bus Fail" ), TxtItem ( tidSystemHBusErr, "Sys Bus Fail" ), /*----------------------------------------------------------------------------*/ #ifdef InModTxtTable (void *)0 #else MaxTextStringId #endif }; #undef TxtItem #endif