<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=50&amp;t=3509&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-07-20T21:12:25+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=50&amp;t=3509&amp;mode</id>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2018-07-20T21:12:25+01:00</updated>
<published>2018-07-20T21:12:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=209990#p209990</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=209990#p209990"/>
<title type="html"><![CDATA[Re: Wstęp do programowania μP AVR w C++]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=209990#p209990"><![CDATA[
Kolega to pierwszy post i od razu złota łopatka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 20 lip 2018, o 21:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gielo]]></name></author>
<updated>2018-07-20T12:40:34+01:00</updated>
<published>2018-07-20T12:40:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=209973#p209973</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=209973#p209973"/>
<title type="html"><![CDATA[Re: Wstęp do programowania μP AVR w C++]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=209973#p209973"><![CDATA[
Jest możliwość dokończenia tego kursu? ewentualnie wskazania w sieci innego kursu na jakim można oprzeć naukę programowania AVR?.  Sam c++ znam, jednak wykorzystanie go do pisania programów dla AVR z biblioteka atmela to trochę inna bajka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14072">gielo</a> — 20 lip 2018, o 12:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Pilarek]]></name></author>
<updated>2014-05-03T13:19:51+01:00</updated>
<published>2014-05-03T13:19:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=79926#p79926</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=79926#p79926"/>
<title type="html"><![CDATA[Re: Wstęp do programowania μP AVR w C++]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=79926#p79926"><![CDATA[
Przepraszam, że odkopuję wątek, ale:<br />1. Nie będziesz używał wyjątków na mikrokontrolerach, bo są wolne. W czystym C ich nie ma fakt, bo C nie programuje obiektowo.<br />2. NIE MA REFERENCJI W C. Możesz używać wskaźników ale nie referencji jako takich jakie są w języku C++.<br />3. Język C nie ma wbudowanego typu bool. Jest to dodane w w bibliotekach, ale wbudowanych typów boolean'owych nie ma.<br />4. ANSI C to nie K&amp;R C To są 2 różne standardy i K&amp;R C jest starszy. Bardzo dobrą książką do C jest C. Szkoła programowania Stephena Praty albo jak ktoś dokładnie chce poznać ten język (bardzo dokładnie) to C Refference Manual.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1520">Pilarek</a> — 3 maja 2014, o 13:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz91]]></name></author>
<updated>2014-01-24T23:16:59+01:00</updated>
<published>2014-01-24T23:16:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=66520#p66520</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=66520#p66520"/>
<title type="html"><![CDATA[Re: Wstęp do programowania μP AVR w C++]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=66520#p66520"><![CDATA[
Znalazłem kilka błędów w tym poradniku i są to bardzo znaczące błędy:<br />Z tego co mi wiadomo to:<br />1. Obsługa wyjątków została wprowadzona dopiero w języku C++ (nie ma jej w &quot;czystym&quot; C), czyli chodzi o słowa kluczowe try, throw, catch<br />2. Referencje do zmiennej są również w C więc nie jest to jako zaleta C++ w stosunku do C<br />3. Typ BOOL jest również w C.<br /><br />Jeżeli ktoś chce poznać język C ale w jego czystej postaci ANSI C to zalecam książkę &quot;Język C - B.W. Keringhan, D.M. Ritchie&quot; gdyż jest to książka napisane przez twórcę tego języka. Jednak nie ma tam nic o mikrokontrolerach ale ksiązka ukazuje standard C.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2397">mateusz91</a> — 24 sty 2014, o 23:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-13T09:13:56+01:00</updated>
<published>2013-07-13T09:13:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=41586#p41586</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=41586#p41586"/>
<title type="html"><![CDATA[Re: Wstęp do programowania μP AVR w C++]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=41586#p41586"><![CDATA[
Może w tym miejscu jako uzupełnienie pokażę jak rozpoczynać taki sam projekt C++ ale w środowisku Eclipse:<br /><br />Wybieramy opcję tworzenia nowego projektu ale tym razem C++ (a nie tak jak wcześniej C) <br /><a href="http://forum.atnel.pl/_obrazki/o/54/a2e2f5e92c9122bbee70d266c44c33ff.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/54/a2e2f5e92c9122bbee70d266c44c33ff.jpg" alt="Obrazek" /></a><br /><br />wprowadzamy nazwę projektu - może być dowolna, ja przypadkowo użyłem tu w nazwie na końcu _cpp (nie jest to konieczne)<br /><a href="http://forum.atnel.pl/_obrazki/o/54/24650fc2b816b91626b159bac2af2b35.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/54/24650fc2b816b91626b159bac2af2b35.jpg" alt="Obrazek" /></a><br /><br />jak zwykle odptaszkowujemy profil Debug<br /><a href="http://forum.atnel.pl/_obrazki/o/54/040542f77e08fb2bfd93845eca183cb0.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/54/040542f77e08fb2bfd93845eca183cb0.jpg" alt="Obrazek" /></a><br /><br />możemy tu wybrać procka i taktowanie, ale ja zwykle wolę to później zrobić we właściwościach projektu bo łatwiej:<br /><a href="http://forum.atnel.pl/_obrazki/o/54/893ac01229fdb969cf3419ca15a33019.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/54/893ac01229fdb969cf3419ca15a33019.jpg" alt="Obrazek" /></a><br /><br />i tworzymy także z Menu File--&gt;New--&gt; C Source file<br /><a href="http://forum.atnel.pl/_obrazki/o/54/e10d3f285b767fab9bcacd4a447c7f4b.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/54/e10d3f285b767fab9bcacd4a447c7f4b.jpg" alt="Obrazek" /></a><br />ale tym razem Uwaga! koniecznie nadajemy plikom źródłowym rozszerzenie *.cpp <br /><br />i wtedy możemy zaczynać tak jak kolega pisze w poradniku:<br /><a href="http://forum.atnel.pl/_obrazki/o/54/54917492f83efd57ffb158fcd9f853d8.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/54/54917492f83efd57ffb158fcd9f853d8.jpg" alt="Obrazek" /></a><br />Jak widać projekt ładnie się skompilował - a Eclipse mam z AtmelTolchain'em<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 lip 2013, o 09:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2013-07-12T00:34:13+01:00</updated>
<published>2013-07-11T23:19:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=41419#p41419</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=41419#p41419"/>
<title type="html"><![CDATA[Wstęp do programowania μP AVR w C++]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3509&amp;p=41419#p41419"><![CDATA[
Witam wszystkich bardzo serdecznie  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jako, że jest to mój pierwszy poradnik tego typu, z góry przepraszam za ewentualne nieścisłości lub niedociągnięcia oraz niekonsekwentne używanie form osobowych i nieosobowych - jeszcze się nie wprawiłem w pisaniu takich poradników <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br />Wszystkie kwestie formatowane <em>kursywą</em> są moimi spostrzeżeniami, które można pominąć <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />.<br />Postaram się ten post często aktualizować, aby go ukończyć.<br /><br />Moim celem jest przekonanie forumowiczów i nie tylko, do przerzucenia się na język C++ dla AVR. Przy tym chciałbym zaznaczyć, że nie mówię tutaj absolutnie o wyższości tego języka programowania nad innymi, a jedynie przedstawić nowatorskie rozwiązania znacznie umilające pracę programisty.<br /><br />Osoby, które nie miały wcześniej styczności z programowaniem, lub nieużywające wcześniej języka C/C++ mogą nie w pełni wszystko zrozumieć, mimo iż będę się starał wykonywać wszystkie działania krok po kroku, dodając za każdym razem komentarze do kodu. Gdy coś będzie nie jasne bardzo proszę pisać najlepiej tutaj na forum, a nie na priv, gdyż ktoś może mieć podobny problem, a razem na pewno uda nam się go rozwiązać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Dodatkowo zachęcam do wcześniejszego zapoznania się z językiem C, najlepiej z książki „Mikrokontrolery AVR Język C - Podstawy programowania”.<br /><br /><span style="font-size: 150%; line-height: normal">Na wstępie przystąpię do omówienia zalet i wad programowania zorientowanego obiektowo (C++ dla AVR):</span><br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> hermetyzacja (enkapsulacja) - pełna kontrola nad zakresem widoczności pól (składowych klasy) oraz metod<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> możliwość podziału algorytmów na mniejsze składniki w pełni odzwierciedlające rzeczywistość oraz świat wirtualny (klasy, dziedziczenie)<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> pełne wsparcie dla programistów opierających swoje projekty o biblioteki innych osób (identyczne nazwy zmiennych i funkcji bez użycia mechanizmów zasięgu zmiennych oraz przeciążania funkcji - przestrzenie nazw)<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> nowe typy danych (m.in. bool - wartości logiczne: true, false; _Complex i _Imaginary - liczby zespolone: część rzeczywista i urojona)<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> nowe słowa kluczowe rozszerzające możliwości języka<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> prostsza alokacja pamięci (new, delete)<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> deklaracja zmiennych w dowolnym miejscu programu (nie ma konieczności deklarowania zmiennych na początku instrukcji blokowej)<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> szablony funkcji i klas - możliwe wywołanie funkcji z wartościami różnych typów (bez potrzeby przeciążania funkcji, czy też stosowania typu pustego void*)<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> przeciążanie operatorów - nadawanie nowych znaczeń dla istniejących operatorów<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> referencja, czyli alias dla zmiennej, funkcji…<br /><span style="font-size: 200%; line-height: normal"><span style="color: #00FF00"><strong>+</strong></span></span> oraz wiele, wiele więcej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><span style="font-size: 200%; line-height: normal"><span style="color: #FF0000"><strong>-</strong></span></span> trudniejsza składnia w stosunku do ANSI C<br /><span style="font-size: 200%; line-height: normal"><span style="color: #FF0000"><strong>-</strong></span></span> brak obsługi wyjątków (try, catch, throw)<br /><span style="font-size: 200%; line-height: normal"><span style="color: #FF0000"><strong>-</strong></span></span> nie wszystkie mechanizmy języka ujęte w standardzie działają w przypadku kompilatorów C++ dla AVR<br /><span style="font-size: 200%; line-height: normal"><span style="color: #FF0000"><strong>-</strong></span></span> na chwilę obecną bardziej znaczących uchybień nie wychwyciłem, mam nadzieję, że ta lista wad będzie się z czasem skracać <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Więcej szczegółów dotyczących różnic (nie koniecznie działających w kompilatorach C++ dla AVR) znajduje się <a href="http://david.tribble.com/text/cdiffs.htm"  class="postlink">tutaj</a>.<br /><br /><span style="font-size: 200%; line-height: normal"><strong><span style="color: #000080">Pierwszy projekt</span></strong></span><br /><br />Ze względu na to, iż używam środowiska AtmelStudio, to w nim prezentował będę pierwsze kroki przy tworzeniu nowego projektu w C++. <br />Nie używałem programu Eclipse, dlatego nie jestem w stanie umieścić zrzutów ekranowych z realizacji tych projektów. Jeśli zajdzie taka potrzeba bardzo proszę osoby bardziej biegłe ode mnie w programie Eclipse, do podzielenia się tą wiedzą. <br /><br />Z menu „<strong>File-&gt;New</strong>” wybieramy „<strong>Project…</strong>” lub używamy skrótu „Ctrl+Shift+N”.<br />W tym momencie należy wybrać zakładkę „<strong>Installed Templates</strong>” oraz opcję „<strong>C/C++</strong>”, póxniej trzeba zaznaczyć pole „<strong>GCC C++ Executable Project</strong>”. Następnie <strong>nadajemy nazwę</strong> dla nowo tworzonego projektu oraz <strong>nazwę solucji</strong>, która domyślnie jest taka sama jak nazwa projektu. Można zrezygnować z tworzenia folderu dla nowej grupy projektów, odznaczając pole „Create directory for solution”. Jeśli do końca nie wiesz, co to oznacza to pozostaw to pole zaznaczone, dzięki czemu będzie możliwość dodania programów dla wielu procesorów w ramach jednego zbiorczego projektu, przy jednoczesnym utrzymaniu porządku w domyślnym folderze „Atmel Studio”.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1183/abf52d6f4378f5ca655e7e3e4aafef3a.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1183/abf52d6f4378f5ca655e7e3e4aafef3a.png" alt="Obrazek" /></a><br /><br />Po zaakceptowaniu wprowadzonych zmian pojawia się kolejne okno do wyboru mikroprocesora, dla którego będziemy pisać program. Używając listę wyboru „rodziny urządzenia” mamy możliwość wstępnego przefiltrowania wyników tak dużej bazy mikrokontrolerów. Ja jednak użyję bardzo pomocnego pola wyszukiwarki „<strong>Search for device</strong>”, dzięki któremu wyszukam przykładowy procesor ATMega1284P, wpisując jedynie fragment nazwy:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1183/15263cb6cb06ae3013b6b4eb72d7c3c8.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1183/15263cb6cb06ae3013b6b4eb72d7c3c8.png" alt="Obrazek" /></a><br /><br />Po zaznaczeniu odpowiedniego procesora i kliknięciu „OK” możemy wreszcie przystąpić do pisania kodu. Omówię w nim podstawowe zasady obiektowości oraz praktyczny przykład wykorzystania takiego „potworka” <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><span style="font-size: 200%; line-height: normal"><strong><span style="color: #000080">Pierwszy program w C++</span></strong></span><br /><br />Wbrew pozorom nie będzie to słynny „Hello World”, a coś bardziej praktycznego. Oczywiście nie z tego względu, że jest to zbyt błahy algorytm, a wręcz przeciwnie w przypadku mikroprocesorów nie jest tak łatwo, gdyż trzeba zaadaptować jakiś wyświetlacz. W tym celu najlepiej byłoby na początek użyć sposobu opisanego przez <a href="http://mirekk36.blogspot.com/2013/05/terminal-jako-kolorowy-wyswietlacz-lcd.html"  class="postlink">Mirka</a>, lecz nawet to podejście wymaga podstawowej wiedzy na temat klas w języku C++, chcąc w pełni wykorzystać jego możliwości. Może nie do końca jasno się wyraziłem - naszym celem będzie utworzenie szeregu bibliotek w C++, tak aby w prosty sposób można było zarządzać różnymi urządzeniami I/O (wejścia/wyjścia).<br /><br />Zajmiemy się tematem <strong>sterowania silników DC</strong> (możliwe również AC - wszystko zależy od modułów wykonawczych), tzn. zmiany kierunku oraz prędkości. Temat ten sukcesywnie będziemy rozszerzać o nowe możliwości tj. pomiar przebytej drogi, regulację położenia (PID) itd..<br /><br />Nasz nowo utworzony program przedstawia się następująco:<br /><br />[syntax=cpp]/*<br /> * Projekt1.cpp<br /> *<br /> * Created: 2013-07-11 20:25:03<br /> *  Author: ATMEL<br /> */ <br /><br /><br />#include &lt;avr/io.h&gt;<br /><br />int main(void)<br />{<br />    while(1)<br />    {<br />        //TODO:: Please write your application code <br />    }<br />}[/syntax]<br /><em>Delikatnie go przerobię używając własnego stylu programistycznego, który oczywiście z pewnością nie jest tym najlepszym, ale dla mnie wygodniejszy i dużo bardziej przejrzysty.</em><br /><br />[syntax=cpp]#include &lt;avr/io.h&gt;<br /><br />int main(void)<br />{<br />while (true)<br />{<br /><br />}<br />}[/syntax]<br />Tą kosmetyczną zmianą jest jedynie usunięcie chwilowo zbędnych komentarzy, gdyż nie ma sensu ich za każdym razem przytaczać. Bardziej istotną modyfikacją jest zamiana stałej dosłownej na odpowiadającą jej wartość <span style="color: #0000FF">true</span>. Może jestem pedantyczny i czepiam się szczegółów, ale w kodzie lubię mieć porządek i szczerze radzę takie podejście początkującym programistom, ponieważ jeśli nie dla Was to dla osób interpretujących taki kod będzie on łatwiejszy do zrozumienia.<br /><br />Już w tym miejscu należy się zatrzymać i zastanowić, co to jest tak naprawdę <span style="color: #0000FF">true</span>. Jest to nowe słowo kluczowe języka C++, które w raz z <span style="color: #0000FF">false</span> i <span style="color: #0000FF">bool</span> tworzą nowy typ danych, jakim jest typ logiczny.<br />Z wartościami logicznymi można było się spotkać również w języku C, ale tam były one widoczne w sposób niejawny, tj. wyrażenia logiczne w warunkach, pętlach, czy też obliczeniach z operatorami logicznymi. Pamiętając zasady związanie z operacjami logicznymi można powiedzieć, że każda wartość różna od zera jest interpretowana jako <span style="color: #0000FF">true</span>, natomiast wartości równe zero to <span style="color: #0000FF">false</span>. Tak więc zapis: <span style="text-decoration: underline"><span style="color: #0000FF">bool</span> <span style="color: #000080">a</span> = <span style="color: #0000FF">true</span>;</span> oznacza to samo co <span style="text-decoration: underline"><span style="color: #0000FF">uint8_t</span> <span style="color: #000080">a</span> = 1;</span>, a <span style="text-decoration: underline"><span style="color: #0000FF">bool</span> <span style="color: #000080">b</span> = <span style="color: #0000FF">false</span>;</span> to <span style="text-decoration: underline"><span style="color: #0000FF">uint8_t</span> <span style="color: #000080">b</span> = 0;</span>, bo faktycznie zmienne typu logicznego są utożsamiane z jednobajtową zmienną bez znaku. Ktoś może w takim razie powiedzieć: „Po co wprowadzać nowy typ danych, skoro jest to ten sam typ co używany dotychczas.”, a ja odpowiem „Dla odseparowania wartości logicznych od liczbowych.”. Podobnie używamy słowa kluczowego typedef dla przedefiniowywania typów, ale tego zagadnienia nie śmiem ponownie opisywać, przy tak wyczerpującym temat <a href="http://mirekk36.blogspot.com/2013/07/struktury-w-c-wyjasnijmy-sobie-dokadnie.html"  class="postlink">artykule mistrza</a> <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br /><em>Ale się rozpisałem na tak można powiedzieć prozaicznie jasny temat. Jeśli w ten dogłębny sposób będę opisywał każde zagadnienie to chyba nikt nie będzie w stanie doczytać do końca <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.</em><br /><br />Kontynuujemy więc nasze rozważania i od razu bez zbędnego owijania w bawełnę przejdziemy do kodu:<br /><br />[syntax=cpp]#include &lt;avr/io.h&gt;<br /><br />class TMotor<br />{<br /><br />};<br /><br />int main(void)<br />{<br />while (true)<br />{<br /><br />}<br />}[/syntax]<br />Użyte zostało tutaj słowo kluczowe <span style="color: #0000FF">class</span> definiujące klasę. Bez obaw nie jest to taka trudna kwestia, a już na pewno nie dla osób znających ideę struktur. Tak naprawdę klasę można formalnie zastąpić strukturą w języku C++, jednak nie jest to zalecany zabieg, gdy mamy do czynienia z bardziej złożonymi obiektami, które mogą być w bardziej czytelny sposób opisane za pomocą klas.<br />Najbardziej znaczącą różnicą między klasą, a strukturą jest domyślny operator widoczności (dla klasy jest to private, natomiast dla struktury public), o którym opowiem w dalszej części artykułu. Może być pewnie zaskoczeniem taka pełna zgodność wsteczna, ale zapewniam, że istnieje możliwość deklarowania funkcji tzw. metod w strukturze! O tym również dalej…<br /><br />Dzięki klasie tworzymy pewien szablon (w tym przypadku silnika), który istnieje w rzeczywistości. Nie chodzi tutaj o jakiś konkretny silnik, ale ogólnie mówimy kompilatorowi, że istnieje coś takiego jak silnik. Podobnie jest w przypadku wszystkich typów danych - <span style="color: #0000FF">uint8_t</span> jest pewnym wzorcem definiującym pewien zakres liczb, ale nie jest to jakaś konkretna zmienna tego typu, przechowująca konkretną wartość w danej chwili czasowej.<br />Teraz pewnie padnie pytanie, dlaczego taką dziwną nazwę nadałem naszej klasie. Jest to spowodowane tym, że w swojej pracy używam również języka Delphi (Object Pascal), w którym standardem stało się definiowanie nazw klas od literki „T”. Nie wiem do końca jak sprawa się ma w przypadku języka C++ (wiele razy czytałem, że tak samo, ale nie chcę tutaj bzdur pisać, jeśli to nie prawda), ale domyślam się, że tak samo. Oczywiście nazwa klasy nie podlega jakimś ścisłym regułom (oprócz tycz dotyczących nadawania nazw zmiennych - nie będę tutaj wszystkiego, aż tak dokładnie opisywał). Musi jednak być intuicyjna i od razu rozpoznawalna, dlatego dodałem angielskie słówko „Motor” oznaczające silnik. Jeśli się komuś taki zapis nie podoba i uważa, że Polak musi programować w języku polskim to nie ma problemu, każdy może nadać taką nazwę, jaka mu się podoba.<br /><br /><em>Ja jednak będę kontynuował wszystkie zapisy w języku angielskim i to nie z tego powodu, aby pokazać jaki to biegły i obeznany jestem w tym języku, bo wręcz przeciwnie, a dlatego że zdecydowanie lepiej pisze mi się przy użyciu prostych wyrażeń angielskich, niż odmian i znaków diakrytycznych (które zdecydowanie odradzam, mimo iż kompilatory jej coraz bardziej wspierają - nie zalicza się jednak do nich AtmelStudio <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />) w języku polskim. </em><br /><br />Bardzo ważna jest sama konstrukcja klasy. W tak prostej i schematycznej formie, zapis sprowadza się do słowa kluczowego <span style="color: #0000FF"><strong>class</strong></span>, po który następuje <strong>nazwa klasy</strong> oraz <strong>nawiasy klamrowe</strong>, koniecznie <strong><span style="text-decoration: underline">zakończone średnikiem</span></strong>. Co prawda nie jest wymagane podanie nazwy klasy (klasa anonimowa) przy jednoczesnej deklaracji zmiennej obiektowej, ale nie jest to zalecane podejście. Chcąc zachować zasady dobrego stylu programowania w przyszłości będziemy dzielić kod na odrębne pliki, co wyklucza takie „laurkowe” sposoby. <br /><br /><em>Co więcej będziemy tworzyć i posługiwać się wskaźnikami na obiekt danej klasy, gdzie niezbędne jest wywołanie konstruktora, który nosi taką samą nazwę jak klasa (jeśli klasa nie posiada nazwy to nie jest możliwe wywołanie jej konstruktora).<br />Powyższe zdanie może wywołać u początkujących dreszczyk emocji i zniechęcenie do dalszego czytania, dlatego zdecydowałem się je obarczyć kursywą <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />. Spokojnie wszystko się wyjaśni w dalszej części - gwarantuję, że po przeczytaniu ze zrozumieniem całego artykułu to zdanie okaże się śmiesznie proste <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.</em><br /><br />Może nie jest to do końca najlepszy moment, gdyż klasa jest zupełnie pusta tzn. nie zawiera żadnego interfejsu i struktury (pól, atrybutów); ale utworzymy obiekt tej klasy tzw. instancję klasy.<br />Chciałbym w tym miejscu usystematyzować wiedzę na temat tych dwóch pojęć w sposób obrazowy:<br /><strong>Klasa</strong> - np. samochód - wiadomo, że ma cztery koła, kierownicę i jeszcze kilka niezbędnych drobiazgów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />)<br /><strong>Obiekt</strong> - konkretny pojazd danej marki, modelu oraz wersji<br /><br />Zasady deklaracji zmiennych strukturalnych i obiektowych w C++ są mniej uciążliwe niż w „czystym” języku C, dlatego też nie jest wymaganie użycie słów kluczowych <span style="color: #0000FF">struct</span> oraz <span style="color: #0000FF">class</span>, a jedynie nazwy typu i zmiennej. Nie ma więc potrzeby przedefiniowywania typów (nadawania aliasów), co wcale nie wyklucza sensu stosowania <span style="color: #0000FF">typedef</span>.<br /><br /><strong><span style="font-size: 200%; line-height: normal"><span style="color: #FF0000">CDN...</span></span></strong><br /><br />Postaram się rozbudowywać ten artykuł w miarę możliwości czasowych.<br /><br /><br /><span style="font-size: 150%; line-height: normal"><span style="color: #FF0000">Dyskusję na temat tego poradnika proszę prowadzić w oddzielnym wątku:</span></span> <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic3516.html" >topic3516.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 11 lip 2013, o 23:19</p><hr />
]]></content>
</entry>
</feed>