/* * C program to illustrate the use of postfix to make the code more readable. * * It produces this output =================! Hello World! =================! =================! 3 50 47 0 0 50 0x0040806c 89 -39 0x004085fc 35 15 0x0040829c 10 40 0x0040810c 20 30 0x004081ac 30 20 0x0040824c 40 10 0x004082ec =================! 3 50 47 0 89 -39 0x0040929c 35 15 0x00408f3c 10 40 0x00408dac 20 30 0x00408e4c 30 20 0x00408eec 40 10 0x00408f8c =================! 3 50 47 0 89 -39 0x00408c4c 35 15 0x004088ec 10 40 0x0040875c 20 30 0x004087fc 30 20 0x0040889c 40 10 0x0040893c =================! "c:\lcc\projects\default\dev\lcc\dhr.exe" Return code 0 Execution time 0.091 seconds Press any key to continue... * */ #include #include #include #define ARRAY_LEN 100 typedef struct leakyBucketData leakyBucketDataT; //- type definition // ============================ struct leakyBucketData { int fill; int leak; leakyBucketDataT * nextLb; // coded without P postfix leakyBucketDataT * nextLbP; // coded with P postfix }; /* * old format variable names lb0,lb1,lb2 * use no postfix. I have run out of names so use lb1,lb2 */ struct leakyBucketData lb0; //- instance of leakyBucketData struct leakyBucketData lb1[ARRAY_LEN]; //- Array of instances of leakyBucketData struct leakyBucketData *lb2; //- Pointer to instance of leakyBucketData /* * Use Type Defs to simplify * use a postfix T for Typedef */ //typedef struct leakyBucketData leakyBucketDataT; //- type definition leakyBucketDataT lb; //- instance of leakyBucketData /* * new format variable names lb,lbArray,lbPtr * use a postfix Array for arrays and Ptr for Pointers * This may be a bit verbose */ leakyBucketDataT lbArray[ARRAY_LEN]; //- Array of instances of leakyBucketData leakyBucketDataT *lbPtr; //- Pointer to instance of leakyBucketData /* * new format variable names lb,lbA,lbP * use a postfix A for Array and P for Pointer */ leakyBucketDataT lbA[ARRAY_LEN]; //- Array of instances of leakyBucketData leakyBucketDataT *lbP; //- Pointer to instance of leakyBucketData /* * * you can declare a function to return a structure in C. * It returns a memory copy, but the pointers are not followed. * */ leakyBucketDataT lbF( leakyBucketDataT * lbP, int initFill, int initLeak ) { leakyBucketDataT localLb; localLb.fill = initFill; localLb.leak = initLeak; localLb.nextLb = lbP; // coded without P postfix localLb.nextLbP = lbP; // coded with P postfix return localLb; }; // ============================ void init( void ){ int cnt; for ( cnt = 0 ; cnt < ARRAY_LEN ; cnt++ ){ lb1[ cnt ].fill = cnt; lb1[ cnt ].leak = ARRAY_LEN/2 - cnt; lb1[ cnt ].nextLb = &lb1[ cnt ]; // without P postfix lb1[ cnt ].nextLbP = &lb1[ cnt ]; // with P postfix } for ( cnt = 0 ; cnt < ARRAY_LEN ; cnt++ ){ lbArray[ cnt ].fill = cnt; lbArray[ cnt ].leak = ARRAY_LEN/2-cnt; lbArray[ cnt ].nextLb = &lbArray[ cnt ]; lbArray[ cnt ].nextLbP = &lbArray[ cnt ]; } for ( cnt = 0 ; cnt < ARRAY_LEN ; cnt++ ){ lbA[ cnt ]=lbF( &lbA[ cnt ] , cnt, ARRAY_LEN/2- cnt ); // lbA[ cnt ].fill = cnt; // lbA[ cnt ].leak = (ARRAY_LEN/2)-cnt; } } int main(int argc,char *argv[]){ printf("\n=================!"); printf("\nHello World!"); printf("\n=================!"); printf("\n"); init(); printf("\n=================!"); /* * old format variable names lb0,lb1,lb2 * use no postfix. I have run out of names so use lb1,lb2 */ printf("\n %d %d ",lb1[3].fill,lb1[ARRAY_LEN/2].fill ) ; printf("\n %d %d ",lb1[3].leak,lb1[ARRAY_LEN/2].leak ); lb2 = lb1; printf("\n %d %d %p",(*lb2).fill,(*lb2).leak,lb2->nextLb ); lb2 = &lb1[89]; printf("\n %d %d %p",lb2->fill,lb2->leak,lb2->nextLb ); lb2 = &lb1[35]; printf("\n %d %d %p",lb2->fill,lb2->leak,lb2->nextLb ); lb2 = lb1; // lb2 +=10; // increment point by 10 elements of the array printf("\n %d %d %p",lb2->fill,lb2->leak,lb2->nextLb ); lb2 +=10; // increment point by 10 elements of the array printf("\n %d %d %p",lb2->fill,lb2->leak,lb2->nextLb ); lb2 +=10; // increment point by 10 elements of the array printf("\n %d %d %p",lb2->fill,lb2->leak,lb2->nextLb ); lb2 +=10; // increment point by 10 elements of the array printf("\n %d %d %p",lb2->fill,lb2->leak,lb2->nextLb ); printf("\n=================!"); /* * new format variable names lb,lbArray,lbPtr * use a postfix Array for arrays and Ptr for Pointers * This may be a bit verbose */ printf("\n %d %d ",lbArray[3].fill,lbArray[ARRAY_LEN/2].fill ) ; printf("\n %d %d ",lbArray[3].leak,lbArray[ARRAY_LEN/2].leak ); lbPtr = &lbArray[89]; printf("\n %d %d %p",(*lbPtr).fill,(*lbPtr).leak,(*lbPtr).nextLbP ); lbPtr = &lbArray[35]; printf("\n %d %d %p",lbPtr->fill,lbPtr->leak,lbPtr->nextLbP ); lbPtr = lbArray; // lbPtr +=10; // increment point by 10 elements of the array printf("\n %d %d %p",lbPtr->fill,lbPtr->leak,lbPtr->nextLbP ); lbPtr +=10; printf("\n %d %d %p",lbPtr->fill,lbPtr->leak,lbPtr->nextLbP ); lbPtr +=10; printf("\n %d %d %p",lbPtr->fill,lbPtr->leak,lbPtr->nextLbP ); lbPtr +=10; printf("\n %d %d %p",lbPtr->fill,lbPtr->leak,lbPtr->nextLbP ); printf("\n=================!"); /* * new format variable names lb,lbA,lbP * use a postfix A for Array and P for Pointer */ printf("\n %d %d ",lbA[3].fill,lbA[ARRAY_LEN/2].fill ) ; printf("\n %d %d ",lbA[3].leak,lbA[ARRAY_LEN/2].leak ); lbP = &lbA[89]; printf("\n %d %d %p ",(*lbP).fill,(*lbP).leak,(*lbP).nextLbP ); lbP = &lbA[35]; printf("\n %d %d %p ",lbP->fill,lbP->leak,lbP->nextLbP ); lbP = lbA; // lbP +=10; // increment point by 10 elements of the array printf("\n %d %d %p ",lbP->fill,lbP->leak,lbP->nextLbP ); lbP +=10; printf("\n %d %d %p ",lbP->fill,lbP->leak,lbP->nextLbP ); lbP +=10; printf("\n %d %d %p",lbP->fill,lbP->leak,lbP->nextLbP ); lbP +=10; printf("\n %d %d %p",lbP->fill,lbP->leak,lbP->nextLbP ); printf("\n=================!"); return 0; }