Hrvatsko društvo za robotiku - Uvod u robotiku - vježbe

Opis pločice

Cilj

Upis podataka koji opisuju pločicu.

Opisna polja

class Tile {

	uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
	...
}
Pogledajmo sad detaljnije kako spremati zidove. Spremaju se u varijeblu "_wall", tipa bajt, koja u sebi ima 8 bitova. Znači, možemo spremiti 8 podataka.

Prva 2 bita ćemo rezervirati za desni zid, druga 2 za donji, itd. Znači, 4 para bitova za 4 zida.

Ove radnje vrše 2 funkcije; "wallGet()" i "wallSet()". Kratke su, ali sadrže relativno komplicirano baratanje bitovima, pa ih nećemo proučavati.

Pogledajmo radije enumaraciju "WallStatus", u dijelu koji slijedi.

Status zida

...
enum WallStatus{ NO_WALL, WALL_UNKNOWN, WALL_WITH_VICTIM, WALL_WITHOUT_VICTIM};
...
Status zida je jedna od mogućnosti koju daje "WallStatus".

"NO_WALL" je kratica za broj 0, "WALL_UNKNOWN" za 1, "WALL_WITH_VICTIM" za 2 i "WALL_WITHOUT_VICTIM" za 3. Zapravo je svejedno pisali u kodu "WALL_WITHOUT_VICTIM" ili "3".

Opet, osnovnoškolska informatika: 0 (u dekadskom sustavu) je u binarnom sustavu 0 (ili 00), 1 je 1 (ili 01), 2 je 10, 3 je 11. Uočimo da su to sve kombinacije koje možemo ostvariti s 2 bita i da na taj način možemo pospremiti gornje statuse za sva 4 zida u 8 bitova (4 para).

Npr, što znači "_wall" "01 11 10 00" (razmaci dodani)? Prvi par je "01", znači i dekadski 1, znači "NO_WALL".

Drugi par je "11", dekadski 3, znači "WALL_WITHOUT_VICTIM".

Itd.

Površina

class Tile {

	uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
	uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
	Tile* _chain; // Pointer to the next tile in chain.
	
public:
	static Tile* first; // Static member variable (one instance for the ...

	Direction breadcrumb; // Stores direction of the previous tile, needed for ...

	int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
	int8_t y; // y coordinate of the tile. Increasing in UP direction.
	...
}
"uint8_t _surface;" sprema tip površine. Koriste se samo prva 2 bita, ostatak je slobodan za buduće potrebe.

U ta se 2 bita sprema podatak iz enumeracije "TileSurface", koji može imati vrijednosti: "SURFACE_BLACK", "SURFACE_SILVER", "SURFACE_UNKNOWN" i "SURFACE_WHITE".

Dakle, slično kao i za zidove, imamo 4 mogućnosti, koje spremamo u 2 bita.

Pokazivači (pointeri)

class Tile {

	uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
	uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
	Tile* _chain; // Pointer to the next tile in chain.
	
public:
	static Tile* first; // Static member variable (one instance for the ...

	Direction breadcrumb; // Stores direction of the previous tile, needed for ...

	int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
	int8_t y; // y coordinate of the tile. Increasing in UP direction.
	...
}
U strukturi su 2 pointera, koji pokazuje na pločice.

_chain smo opisali. On je veza među karikama lanca.

static Tile* first; označava vezu na prvu kariku lanca, prvu pločicu. Kako ne treba isti podatak spremati u svaku pločicu, na početku je riječ "static", koja označava da će to biti jedna varijabla, zajednička za sve pločice.

Smjer

class Tile {

	uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
	uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
	Tile* _chain; // Pointer to the next tile in chain.
	
public:
	static Tile* first; // Static member variable (one instance for the ...

	Direction breadcrumb; // Stores direction of the previous tile, needed for ...

	int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
	int8_t y; // y coordinate of the tile. Increasing in UP direction.
	...
}
"breadcrumb" je tipa "Direction", znači poprima vrijednosti "UP", "LEFT", "DOWN", "RIGHT" i "NOWHERE".

Uočite da ovdje nismo pakirali podatak u bitove, nego smo potrošili cijeli bajt.

Da smo bili štedljiviji, stavili bismo ovu varijablu u slobodnih 6 bitova varijable "_surface".

Koordinate

class Tile {

	uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
	uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
	Tile* _chain; // Pointer to the next tile in chain.
	
public:
	static Tile* first; // Static member variable (one instance for the ...

	Direction breadcrumb; // Stores direction of the previous tile, needed for ...

	int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
	int8_t y; // y coordinate of the tile. Increasing in UP direction.
	...
}
Ova su 2 podatka x i y koordinate pločice.

Kako bi brojevi mogli u općem slučaju biti dosta veliki, nismo ih pakirali u bitove.

Zadatak: broj bitova

Koliko je bitova potrebno za spremanje varijable tipa "Direction"?

Primjedbe



Projekt "Uvod u robotiku" sufinanciran je iz Europskog socijalnog fonda, poziv "Jačanje kapaciteta organizacija civilnoga društva za popularizaciju STEM-a". Relevantne stranice: Sadržaj vježbe za virtualne radionice isključiva je odgovornost Hrvatskog društva za robotiku.