\b;Ćwiczenie Zdalnie pokieruj robotem bez używania \l;stacji przekaźnikowej informacji\u object\exchange;. Robot powinien przejść przez 6 niebieskich plusów. Musisz użyć \l;łańcucha\u cbot\string; do przekazania rozkazów podległemu robotowi. Łańcuch zawiera rozkaz, który powinien być wykonany przez tego robota, na przykład \c;"move(20)"\n;. Możesz użyć tej samej składni co w języku CBOT, choć możesz też wybrać dowolną inną, na przykład podobną do tej: \c;"advance=20"\n;. Łańcuch będzie elementem klasy zdefiniowanym jako \c;\l;static\u cbot\static;\n;, używanym do komunikacji pomiędzy robotem nadrzędnym i podległym. Dwoma głównymi postaciami tego ćwiczenia są¦: 1) \l;Transporter na kołach\u object\botgr; bez ogniwa elektrycznego, wobec czego unieruchomiony. Jest to robot nadrzędny, który powinien zostać zaprogramowany aby mógł przesyłać rozkazy do podległego mu robota. 2) Podległy \l;robot treningowy\u object\bottr;, który jest już zaprogramowany i tylko czeka na rozkazy od robota nadrzędnego. \b;Robot podległy Najpierw musisz zrozumieć jak działa program robota podległego. \l;Klasa\u cbot\class; \c;exchange\n; zawiera mechanizmy przekazywania rozkazów. Należy zadeklarować element klasy \c;m_order\n; jako \c;\l;static\u cbot\static;\n;, będzie on zawierał rozkazy do wykonania. Słowo \c;static\n; zapewnia, że element \c;m_order\n; jest współużytkowany przez wszystkie instancje \l;klasy\u cbot\class; exchange. \c;\s;\l;public\u cbot\public; \l;class\u cbot\class; exchange \s;{ \s; \l;static\u cbot\static; \l;private\u cbot\private; \l;string\u cbot\string; m_order = ""; \n;Metoda \c;put\n; będzie używana przez robota nadrzędnego do przesyłania rozkazów. Jeśli łańcuch \c;m_order\n; nie jest pusty, robot podległy nie zakończył wykonywania rozkazu a metoda \c;put\n; zwróci wartość \c;false\n; i niczego nie zrobi. \c;\s; \l;synchronized\u cbot\synchro; \l;bool\u cbot\bool; put(string order) \s; { \s; if ( m_order == "" ) \s; { \s; m_order = order; \s; return true; \s; } \s; else \s; { \s; return false; \s; } \s; } \n; Inna metoda \c;get\n; zostanie użyta przez robota podległego do pobrania rozkazów. Metoda ta zwraca łańcuch zawarty w zmiennej \c;m_order\n; i opróżnia ją, aby mógł być przyjęty nowy rozkaz: \c;\s; \l;synchronized\u cbot\synchro; string get() \s; { \s; string ret = m_order; \s; m_order = ""; \s; return ret; \s; } \s;} \n; Główny program niewolnika zawiera instancję klasy \c;exchange\n; nazwaną \c;list\n;. \c;\s;\l;extern\u cbot\extern; void object::Slave3( ) \s;{ \s; exchange list(); \s; string todo; \n; Zewnętrzna pętla \c;while\n; działa w nieskończoność. Wewnętrzna pętla \c;while\n; czeka na rozkaz używając metody \c;get\n; z klasy \c;exchange\n;. Pętla zatrzymuje się gdy metoda \c;get\n; zwróci pusty łańcuch. \c;\s; \l;while\u cbot\while; ( true ) \s; { \s; \l;while\u cbot\while; ( true ) \s; { \s; todo = list.get(); \s; if ( todo != "" ) break; \s; wait(1); \s; } \n; Po otrzymaniu rozkazu i zapisaniu go w zmiennej \c;todo\n; wystarczy jedynie go wykonać: \c;\s; if ( \l;strfind\u cbot\strfind;(todo, "move") == 0 ) \s; { \s; move(\l;strval\u cbot\strval;(\l;strmid\u cbot\strmid;(todo,5))); \s; } \s; if ( strfind(todo, "turn") == 0 ) \s; { \s; turn(strval(strmid(todo,5))); \s; } \s; } \s;} \n; \b;Robot nadrzędny W robocie nadrzędnym należy napisać funkcję nazwaną \c;SendOrder\n;, która wyśle rozkaz do robota podległego: \c;\s;void object::SendOrder(string order) \s;{ \s; exchange list(); \s; \s; while ( list.put(order) == false ) \s; { \s; wait(1); \s; } \s;} \n; Pętla \c;while\n; czeka na zakończenie oczekującego rozkazu, czyli na wyjście przez robota podległego z metody \c;get\n;. Główny program robota nadrzędnego jest bardzo prosty: \c;\s;extern void object::Remote3( ) \s;{ \s; SendOrder("move(20)"); \s; SendOrder("turn(90)"); \s; SendOrder("move(20)"); \s; SendOrder("turn(90)"); \s; SendOrder("move(10)"); \s; SendOrder("turn(90)"); \s; SendOrder("move(10)"); \s; SendOrder("turn(-90)"); \s; SendOrder("move(10)"); \s;} \n; Klawisz \key;\key help;\norm; umożliwia wyświetlenie tych informacji w dowolnej chwili. \t;Zobacz również \l;Sterowanie\u command; i \l;programowanie\u cbot;.