3.23. MORE ABOUT STRUCTURES
if (s->SizeOfStruct>=sizeof(int)*5)
{
// this is at least ver3, fill_brush_type field is present
printf ("We are going to fill it using brush type %d\n", s->fill_brush_type);
}
};
// early software version
void call_as_ver1()
{
struct ver1 s;
s.SizeOfStruct=sizeof(s);
s.coord_X=123;
s.coord_Y=456;
printf ("** %s()\n", FUNCTION);
draw_circle(&s);
};
// next software version
void call_as_ver2()
{
struct ver2 s;
s.SizeOfStruct=sizeof(s);
s.coord_X=123;
s.coord_Y=456;
s.color=1;
printf ("** %s()\n", FUNCTION);
draw_circle(&s);
};
// latest, most advanced version
void call_as_ver3()
{
struct ver3 s;
s.SizeOfStruct=sizeof(s);
s.coord_X=123;
s.coord_Y=456;
s.color=1;
s.fill_brush_type=3;
printf ("** %s()\n", FUNCTION);
draw_circle(&s);
};
int main()
{
call_as_ver1();
call_as_ver2();
call_as_ver3();
};
In other words,SizeOfStructfield takes a role ofversion of structurefield. It could be enumerate type (1,
2, 3, etc.), but to setSizeOfStructfield tosizeof(struct...)is less prone to mistakes/bugs.
In C++, this problem is solved usinginheritance(3.18.1 on page 547). You just extend your base class
(let’s call itCircle), and then you will haveColoredCircleand thenFilledColoredCircle, and so on. A current
versionof an object (or, more precisely, currenttype) will be determined using C++RTTI.
So when you seeSizeOfStructsomewhere inMSDN—perhaps this structure was extended at least once
in past.
3.23.4 High-score file in “Block out” game and primitive serialization
Many videogames has high-score file, sometimes called “Hall of fame”. Ancient “Block out”^48 game (3D
tetris from 1989) isn’t exception, here is what we see at the end:
(^48) http://www.bestoldgames.net/eng/old-games/blockout.php