Assembly Language for Beginners

(nextflipdebug2) #1

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

Free download pdf