<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Krzysztof Wesołowski &#187; C++</title>
	<atom:link href="http://kwesoly.net/kategoria/programowanie/cpp/feed/" rel="self" type="application/rss+xml" />
	<link>http://kwesoly.net</link>
	<description>Programowanie, elektronika, automatyka - doświadczenia i projekty</description>
	<lastBuildDate>Wed, 07 Sep 2011 14:03:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Zapisywanie ustawień aplikacji &#8211; QSettings w QT</title>
		<link>http://kwesoly.net/programowanie/cpp/zapisywanie-ustawien-aplikacji-qsettings-w-qt/</link>
		<comments>http://kwesoly.net/programowanie/cpp/zapisywanie-ustawien-aplikacji-qsettings-w-qt/#comments</comments>
		<pubDate>Sun, 09 May 2010 18:13:28 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[qsettings]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[ustawienia]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=466</guid>
		<description><![CDATA[Kontynuując tradycję rzadkich wpisów o ciekawych rzeczach które warto poznać/wykorzystać chciałbym wam przybliżyć trochę klasę QSettings. Do tej pory większość moich aplikacji nie potrafiło sensownie obsługiwać pamiętania różnych drobiazgów między uruchomieniami. Często najważniejsze rzeczy zapisywano w jakimś "własnym" typie plików, podczas gdy cała reszta była resetowana po każdym uruchomieniu. Klasa QSettings rozwiązywała część tych problemów [...]]]></description>
			<content:encoded><![CDATA[<p>Kontynuując tradycję rzadkich wpisów o ciekawych rzeczach które warto poznać/wykorzystać chciałbym wam przybliżyć trochę klasę QSettings. Do tej pory większość moich aplikacji nie potrafiło sensownie obsługiwać pamiętania różnych drobiazgów między uruchomieniami. Często najważniejsze rzeczy zapisywano w jakimś "własnym" typie plików, podczas gdy cała reszta była resetowana po każdym uruchomieniu.</p>
<p><span id="more-466"></span>Klasa QSettings rozwiązywała część tych problemów - pozwalając skierować grupę ustawień do pliku/rejestru. Niestety, pierwszy wymyślony sposób ich użycia stał się bardzo szybko uciążliwy - zapisywanie setek ustawień w jednym miejscu, pilnowanie aby odczyt zgadzał się z zapisem - jak łatwo się domyślić szybko stało się to nie do opanowania.</p>
<p>Niedawno czytając dokumentację, i stając przed podobnym problemem znalazłem sensowniejsze podejście - wraz z dostarczonymi metodami pozwalające zminimalizować nakład pracy.</p>
<p>Zacznijmy od samego początku naszego programu, dostarczając parę istotnych informacji:</p>
<p>int main(int argc, char *argv[])<br />
{<br />
QApplication a(argc, argv);<br />
QApplication::setOrganizationName("RainLabs");<br />
QApplication::setOrganizationDomain("rainlabs.pl");<br />
QApplication::setApplicationName("Orbi Eye");<br />
QApplication::setApplicationVersion("0.2 alpha");</p>
<p>AutoPhotoAdvanced b;<br />
b.setWindowTitle(QApplication::applicationName()+" v"+QApplication::applicationVersion());<br />
b.show();<br />
return a.exec();</p>
<p>}</p>
<p>Po takim wywołaniu każda klasa potrzebująca skorzystać z ustawień może to zrobić niezwykle szybko i wygodnie - np. w konstruktorze/destruktorze, za pomocą:</p>
<p>QSettings settings;<br />
settings.setValue(....) / settings.value(...)</p>
<p>dzięki takiemu podziałowi każde ustawienia są niezależne, zaś dokonane na początku ustawienia aplikacji pozwalają korzystać z domyślnego konstruktora, co ułatwia ich używanie w całym programie, nie uciekając się do kopiowania kawałka kodu tam i z powrotem lub co gorsza pamiętania jakie argumenty przekazać za każdym razem konstruktorowi.</p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/cpp/zapisywanie-ustawien-aplikacji-qsettings-w-qt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3</title>
		<link>http://kwesoly.net/programowanie/cpp/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/</link>
		<comments>http://kwesoly.net/programowanie/cpp/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 01:28:49 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[cdt]]></category>
		<category><![CDATA[Code Sourcery]]></category>
		<category><![CDATA[Cortex-M3]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=458</guid>
		<description><![CDATA[Na blogu znajomego zamieściłem wpis na temat związany z nowoczesnymi mikrokontrolerami z którymi ostatnio miałem doczynienia - zapraszam do lektury. Link: Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3]]></description>
			<content:encoded><![CDATA[<p>Na blogu znajomego zamieściłem wpis na temat związany z nowoczesnymi mikrokontrolerami z którymi ostatnio miałem doczynienia - zapraszam do lektury.</p>
<p>Link: <a title="Stały link do Integracja Eclipse CDT z  CodeSourcery dla ARM Cortex-M3" rel="bookmark" href="http://tutro.net/elektronika/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/">Integracja Eclipse CDT z CodeSourcery  dla ARM Cortex-M3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/cpp/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV 2.0 + Windows</title>
		<link>http://kwesoly.net/programowanie/cpp/opencv-2-0-windows/</link>
		<comments>http://kwesoly.net/programowanie/cpp/opencv-2-0-windows/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 19:51:34 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[kompilacja]]></category>
		<category><![CDATA[linker]]></category>
		<category><![CDATA[mingw]]></category>
		<category><![CDATA[opencv]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=414</guid>
		<description><![CDATA[Ze względu na kolejny projekt, w który się zaangażowałem, potrzebowałem działającej, sprawnej biblioteki do przetwarzania obrazu. Wybór padł na OpenCV, zaś strona projektu zaskoczyła nas wydaniem we wrześniu tego roku wersji 2.0. Niestety, próba kompilacji okazała się być podwójnie nieudana Zamieszczam więc krótki opis jak zmusić OpenCV do współpracy. Linkowanie bibliotek - ustawienia linkera Pierwszym [...]]]></description>
			<content:encoded><![CDATA[<p>Ze względu na kolejny projekt, w który się zaangażowałem, potrzebowałem działającej, sprawnej biblioteki do przetwarzania obrazu. Wybór padł na OpenCV, zaś strona projektu zaskoczyła nas wydaniem we wrześniu tego roku wersji 2.0. Niestety, próba kompilacji okazała się być podwójnie nieudana <img src='http://kwesoly.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Zamieszczam więc krótki opis jak zmusić OpenCV do współpracy.</p>
<h3>Linkowanie bibliotek - ustawienia linkera</h3>
<p>Pierwszym problemem z jakim się zetknęliśmy było linkowanie bibliotek - rzut oka do katalogu z bibliotekami utwierdził nas w przekonaniu, że tutorial, którego używamy jest przeznaczony dla OpenCV1.0 lub 1.1. Tak czy inaczej w ustawieniach linkera należy dodać uzupełnione w stosunku do poprzedniej wersji wywołania:</p>
<pre>-lopencv200 -lcxcore200 -lcvaux200 -lml200 -lcxts200 -lhighgui200</pre>
<p>Zaś jako ścieżkę bibliotek (-L) domyślnie:  C:\OpenCV2.0\lib</p>
<p>Taka modyfikacja wywołania pozwoli linkować nasze programy. Ważniejsze jest jednak rozwiązanie problemów związanych z samą kompilacją.</p>
<p><span id="more-414"></span></p>
<h3>Używanie headerów</h3>
<p>Kolejna rzecz, która przebiega sama w sobie bez niespodzianek, to dodanie katalogu z plikami *.h i *.hpp do wywołań kompilatora:</p>
<pre>-IC:\OpenCV2.0\include\opencv</pre>
<h3>Rozwiązanie problemu z kompilacją</h3>
<p>Niestety, pomimo iż biblioteka o tym jawnie nie wspomina, nie została ona dobrze przygotowana do pracy z obecną, stabilną wersją GCC. Aby uniknąć kłopotów przy kompilacji (kłopot==nie działa:)) Najlepiej wybrać nowszą wersję GCC. Pod systemem Windows jednym z lepszych wyborów jeśli chodzi o instalację kompilatora c++, narzędzi do budowania etc. jest pakiet MinGW. Do tej pory korzystałem z oficjalnego wydania MinGW, które "niestety" zawiera oficjalną wersję kompilatora GCC. Świetnie radził sobie on np. z kompilacją programów z biblioteką Qt. Będąc zmuszonym do rezygnacji z tego rozwiązania, a jednocześnie nie chcąc instalować ręcznie całej otoczki (make, binutils, etc.) skorzystałem z strony http://www.tdragon.net/recentgcc/.  Najlepiej wybrać najnowszą wersję w wersji Bundled - nie ma wtedy ryzyka, że któraś z paczek zniknęła z serwera. Po instalacji nowego "pseudo" MinGW (która jest bardzo bezproblemowa) kompilacje z użyciem OpenCV rusza bez problemu.</p>
<p>Warto również zwrócić uwagę, iż Qt 4.5.3 również świetnie działa z GCC 4.4.1, zaś nowsze, "niestabilne" wersje GCC są coraz częściej używane (np pakiet GNU ARM używa GCC serii 4).</p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/cpp/opencv-2-0-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Program prezentujący działanie algorytmów działających na grafach</title>
		<link>http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/</link>
		<comments>http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 22:01:06 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[badania operacyjne]]></category>
		<category><![CDATA[grafy]]></category>
		<category><![CDATA[prezentacja]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=390</guid>
		<description><![CDATA[Przy okazji podnoszenia jednej oceny powstał prosty program prezentujący 3 algorytmy operujące na grafach. Pozwala on wprowadzić dowolny graf, o rożnych wagach a następnie prezentuje jego rozwiązanie krok po kroku. Program powstawał  przy mniejszej lub większe niechęci przez wakacje. Pierwsza część programu to edycja i implementacja struktur grafowych.  Klasy tam zaimplementowane pozwalają zaprojektować graf, zapisać [...]]]></description>
			<content:encoded><![CDATA[
<a href='http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/attachment/grafy_algorytmy_screen1/' title='Tworzenie grafu'><img width="150" height="150" src="http://download.kwesoly.net/2009/10/grafy_algorytmy_screen1-150x150.jpg" class="attachment-thumbnail" alt="Tworzenie grafu" title="Tworzenie grafu" /></a>
<a href='http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/attachment/grafy_algorytmy_screen2/' title='Algorytm Minty&#039;ego'><img width="150" height="150" src="http://download.kwesoly.net/2009/10/grafy_algorytmy_screen2-150x150.jpg" class="attachment-thumbnail" alt="Algorytm Minty&#039;ego" title="Algorytm Minty&#039;ego" /></a>

<p>Przy okazji podnoszenia jednej oceny powstał prosty program prezentujący 3 algorytmy operujące na grafach. Pozwala on wprowadzić dowolny graf, o rożnych wagach a następnie prezentuje jego rozwiązanie krok po kroku.</p>
<p>Program powstawał  przy mniejszej lub większe niechęci przez wakacje. Pierwsza część programu to edycja i implementacja struktur grafowych.  Klasy tam zaimplementowane pozwalają zaprojektować graf, zapisać go/wczytać i uruchomić fragment prezentujący dany algorytm. Drugą częścią jest abstrakcyjna klasa AbstractSolver, ułatwiająca pisanie klas rozwiązujących o spójnym wyglądzie i funkcjonalności. Właśnie te 3 przykładowe algorytmy stanowią drugą cześć, stworzoną już nie przeze mnie ale przez Jakuba Tutro i Pawła Górkę.</p>
<p><span id="more-390"></span></p>
<p>W tym projekcie najbardziej zadowala mnie rozplanowanie jego działania, i zaprojektowanie klas,  które choć zapewne nie jest idealne, umożliwiło jasny podział pracy, zminimalizowało ilość kodu i zwiększyło elastyczność takiego rozwiązania.</p>
<p>Program powstawał przy równoczesnej pracy, dlatego do jej synchronizacji wykorzystałem darmowy serwis <a href="http://www.assembla.com/">http://www.assembla.com/</a>, a konkretnie udostępniony przez niego serwer SVN. Zainteresowani mogą pobrać projekt prosto z repozytorium: <a href="http://subversion.assembla.com/svn/graph-algorithms">http://subversion.assembla.com/svn/graph-algorithms</a>.</p>
<p>Dla nie potrafiących korzystać z SVN, lub tylko chcących zerknąć na efekt prac zamieszczam tutaj gotowy instalator z potrzebnymi plikami DLL (całość opiera się o biblioteki <a href="http://qt.nokia.com/">QT4.5</a>).</p>
<p>Instalator: <a href="http://download.kwesoly.net/2009/10/setupGrafyAlgorytmy.exe">Instalator programu Grafy-Algorytmy</a></p>
<p>Pliki: <a href="http://download.kwesoly.net/2009/10/grafy_release.zip">Pliki wykonywalne i skrypt instalatora</a></p>
<p>Źródła: <a href="http://download.kwesoly.net/2009/10/GrafyAlgorytmy_source.zip">Źródła programu Grafy-Algorytmy</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Używanie klasy QSyntaxHighlighter z bibliotek QT 4.4</title>
		<link>http://kwesoly.net/programowanie/cpp/syntax_highlighter/</link>
		<comments>http://kwesoly.net/programowanie/cpp/syntax_highlighter/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 07:48:48 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[doxygen]]></category>
		<category><![CDATA[highlighting]]></category>
		<category><![CDATA[QSyntaxHighlighter]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[syntax]]></category>
		<category><![CDATA[źródła]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=247</guid>
		<description><![CDATA[W ramach dodatkowego projektu z programowania w języku C++ wykonałem małą aplikację demonstrującą użycie klasy QSyntaxHighlighter z bibliotek Qt do kolorowania składni. Stworzona klasa HSyntaxHighlighter wykorzystuje przygotowane przez twórców Qt elementy co ułatwiło jej wykonanie. Program w prosty sposób koloruje składnie zgodnie z ustawieniami, umożliwia również dostosowanie kolorowania każdego rodzaju kodu do swoich potrzeb za [...]]]></description>
			<content:encoded><![CDATA[<p>W ramach dodatkowego projektu z programowania w języku C++ wykonałem małą aplikację demonstrującą użycie klasy QSyntaxHighlighter  z bibliotek Qt do kolorowania składni. Stworzona klasa HSyntaxHighlighter wykorzystuje przygotowane przez twórców Qt elementy co ułatwiło jej wykonanie. Program w prosty sposób koloruje składnie zgodnie z ustawieniami, umożliwia również dostosowanie kolorowania każdego rodzaju kodu do swoich potrzeb za pomocą:</p>
<ul>
<li>wyboru czcionki odpowiedzialnej za daną część kodu</li>
<li>wyboru koloru czcionki</li>
<li>wyboru tła</li>
<li>oraz edycji wyrażeni/wyrażeń regularnych odpowiedzialnych za rozpoznawanie tekstu</li>
</ul>
<p><span id="more-247"></span></p>
<p>Program obsługuje podstawowe bloki</p>
<ul>
<li>Komentarz jednoliniowy</li>
<li>Komentarz wieloliniowy</li>
<li>Stałe znakowe</li>
<li>Stałe liczbowe</li>
<li>Dyrektywy preprocesora</li>
<li>Słowo kluczowe/zarezerwowane</li>
</ul>
<p>ale jego struktura umożliwia łatwe dodawanie własnych bloków (poprzez edycje kilku stałych wartości przed kompilacją)</p>
<p>Ustawienia dotyczące kolorowania są przechowywane w plikach *.ini, za pomocą klasy QSettings.</p>
<p>Program został napisany w  środowisku <a href="http://www.eclipse.org/">Eclipse CDT</a> , z dodatkami <a href="http://trolltech.com/developer/eclipse-integration">QtEclipseIntegration</a> do tworzenie interfejsu oraz <a href="http://eclox.eu/">Eclox</a> w celu ułatwienia używania doxygen'a zaś kod został w całości udokumentowany (w j. angielskim) zgodnie z składnią <a title="Doxygen" href="http://www.doxygen.org">Doxygen</a>.</p>
<p>Zapraszam do przejrzenia i zgłaszania uwag.</p>
<p>Cały program objęty jest licencją GPL 3.0, źródła dostępne poniżej.</p>
<p><a href="http://download.kwesoly.net/2009/01/sh_dll.zip">Syntax Highlighter 1.0 (wraz z plikami DLL od Qt)</a></p>
<p><a href="http://download.kwesoly.net/2009/01/sh.zip">Syntax Highlighter 1.0 (tylko plik exe)</a></p>
<p><a href="http://download.kwesoly.net/2009/01/sh_sources.zip">Syntax Highlighter 1.0 (źródła)</a></p>
<p><a href="http://download.kwesoly.net/2009/01/sh_docs.zip">Syntax Highlighter 1.0 (dokumentacja)</a></p>
<p><a href="http://www.gnu.org/licenses/gpl-3.0.html">Licencja GPL 3.0</a><br />
<a name="update"><br />
</a></p>
<h2><a name="update">Wersja 1.1</a></h2>
<p>Poprawiono:</p>
<p>dynamiczna edycja listy bloków, kilka poprawek estetycznych. Bloki podświetlają się niezależnie, po kolei.</p>
<p><a href="http://download.kwesoly.net/2009/01/sh_editable_dll.zip">Syntax Highlighter 1.1 (wraz z plikami DLL od Qt)</a></p>
<p><a href="http://download.kwesoly.net/2009/01/sh_editable.zip">Syntax Highlighter 1.1 (tylko plik exe)</a></p>
<p><a href="http://download.kwesoly.net/2009/01/sh_editable_sources.zip">Syntax Highlighter 1.1 (źródła)</a></p>
<p><a href="http://download.kwesoly.net/2009/01/sh_editable_docs.zip">Syntax Highlighter 1.1 (dokumentacja)</a></p>
<p><a href="http://www.gnu.org/licenses/gpl-3.0.html">Licencja GPL 3.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/cpp/syntax_highlighter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse CDT &#8211; środowisko C/C++</title>
		<link>http://kwesoly.net/programowanie/cpp/eclipse-cdt/</link>
		<comments>http://kwesoly.net/programowanie/cpp/eclipse-cdt/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 23:51:04 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cdt]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=125</guid>
		<description><![CDATA[Instalacja Eclipse: Najpierw zainstalujemy środowisko Eclipse CDT, czyli program Eclipse wzbogacony o dodatkowe wtyczki ułatwiające pracę w językach C/C++. Pobieramy go ze strony: http://www.eclipse.org/downloads/ wersja: Eclipse IDE for C/C++ Developers Pobierzesz w ten sposób skompresowana wersje, która najlepiej sobie rozpakować w jakieś nieprzeszkadzające miejsce (przyjąłem ze to C:\Program Files). Dodatkowo eclipse do działania może wymagać [...]]]></description>
			<content:encoded><![CDATA[<p>Instalacja Eclipse:</p>
<p>Najpierw zainstalujemy środowisko Eclipse CDT, czyli program Eclipse wzbogacony o dodatkowe wtyczki ułatwiające pracę w językach C/C++.</p>
<p>Pobieramy go ze strony:</p>
<p><a title="http://www.eclipse.org/downloads/" href="http://www.eclipse.org/downloads/"> http://www.eclipse.org/downloads/<br />
</a> wersja: <strong>Eclipse IDE for C/C++ Developers</strong></p>
<p>Pobierzesz w ten sposób skompresowana wersje, która najlepiej sobie rozpakować w jakieś nieprzeszkadzające miejsce (przyjąłem ze to C:\Program Files).</p>
<p>Dodatkowo eclipse do działania może wymagać Javy (którą prawdopodobnie już dawno masz ją na swoim komputerze, jeśli nie, pobierzesz ją tutaj: <a title="http://java.com/pl/download/manual.jsp" href="http://java.com/pl/download/manual.jsp">http://java.com/pl/download/manual.jsp</a></p>
<p><span id="more-125"></span></p>
<p>Po pierwszym uruchomieniu Eclipse CDT, gdy mamy już Javę zostaniemy zapytani o domyślny katalog projektów etc, warto wybrać jakiś sensowny, na rzadko czyszczonym dysku, i zaznaczyć że nie chcemy więcej widzieć tego pytania. Niestety, uruchomione teraz środowisko wymaga jeszcze kompilatora.</p>
<p>Do naszych celów, że tak powiem edukacyjnych polecam <a title="Minimalistic Gnu for Windows" href="http://www.mingw.org/">MinGW</a>. Najlepiej z <a title="Strona projektu MinGW na Sourceforge.net" href="http://sourceforge.net/project/showfiles.php?group_id=2435">TEJ STRONY</a> pobrać "Automated MinGW Installer". Po jego uruchomieniu i zdecydowaniu że chcemy pobrać i zainstalować najlepiej wybrać wersję bieżącą (Current) a w liście programów do "MinGW base tools" dodać "g++ compiler" oraz "MinGW make". Pozostałe języki chętnie was uraczą swoimi kompilatorami gdy będziecie ich potrzebować <img src='http://kwesoly.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Po wybraniu ścieżki MinGW pobierze się i zainstaluje na twoim komputerze. Po jego instalacji można skasować ściągnięte instalki czy archiwa, oraz uruchomić system Windows ponownie.</p>
<p>Na dobry początek wykorzystajmy nasze nowe środowisko do stworzenia prostego programu, ot HelloWorlda wyświechtanego.</p>
<p>Klikamy (już w uruchomionym programie) na File-&gt;New-&gt;C++ Project. Wpisujemy jego nazwę oraz wybieramy "ToolChain" MinGW GCC, a jako "Project type" wybieramy Hello World C++ Project. Po wypełnienie podstawowych danych, które Eclipse umieści w komentarzach, projekt zostanie utworzony. Możemy przeglądać jego zawartość w drzewku po lewej, źródła domyślnie są w podkatalogu projektu o nazwie <strong>src</strong>. Projekt taki automatycznie się zbuduje (kompilacja i linkowanie), i możemy uruchomić go w małej dołączonej konsoli klikając zieloną strzałkę. Dodajmy do naszego projektu klasę, ot na przykład prymitywny 2 wymiarowy wektor. Niknięcie na File-&gt;New-&gt;Class włączy bardzo przyjemnego kreatora, który po podaniu nazwy i kilku własności wygeneruje potrzebne pliki wraz z domyślnymi zawartościami (konstrukcje warunkowego dołączania, konstruktor i destruktor etc).</p>
<p>Kod wygenerowany:</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//============================================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Name &nbsp; &nbsp; &nbsp; &nbsp;: witaj.cpp</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Author &nbsp; &nbsp; &nbsp;: twoje imie</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Version &nbsp; &nbsp; :</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Copyright &nbsp; : Your copyright notice</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Description : Hello World in C++, Ansi-style</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//============================================================================</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Hello World!!!&quot;</span> <span class="sy1">&lt;&lt;</span> endl; <span class="co1">// prints Hello World!!!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Vector.h</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* &nbsp;Created on: 2008-10-15</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* &nbsp; &nbsp; &nbsp;Author: twoje imie</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#ifndef VECTOR_H_</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define VECTOR_H_</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Vector <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy4">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;Vector<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;~Vector<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif /* VECTOR_H_ */</span></div>
</li>
</ol>
</div>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Vector.cpp</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* &nbsp;Created on: 2008-10-15</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* &nbsp; &nbsp; &nbsp;Author: twoje imie</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;Vector.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Vector<span class="sy4">::</span><span class="me2">Vector</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// TODO Auto-generated constructor stub</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Vector<span class="sy4">::</span>~Vector<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// TODO Auto-generated destructor stub</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Podsumowują: począwszy od pierwszego programu, Eclipse zmniejsza nakład pracy potrzebny aby napisać jakikolwiek program. Od kolorowania składni, poprzez wskazywanie linijek w których wystąpiły błędy i ostrzeżenia, jak i bogate możliwości konfiguracji, możliwość "podpowiadania" części kodu (możesz ją ręcznie wywoła za pomocą Ctrl+Spacja) a kończąc na obsłudze setek przydatnych wtyczek i wolności tego środowiska: przyda się ono każdemu piszącemu programy w C lub C++. Zachęcam do samodzielnego eksplorowania ustawień (Windows-&gt;Preferences) jak i sprawdzaniu rożnych funkcji dostępnych poprzez Menu programu czy menu kontekstowe.</p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/cpp/eclipse-cdt/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Przeładowanie operatorów cześć 1.</title>
		<link>http://kwesoly.net/programowanie/cpp/przeladowanie-operatorow-1/</link>
		<comments>http://kwesoly.net/programowanie/cpp/przeladowanie-operatorow-1/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 10:41:04 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[operatory]]></category>
		<category><![CDATA[przeciazanie]]></category>
		<category><![CDATA[przeładowanie]]></category>

		<guid isPermaLink="false">http://kwesoly.hekko.pl/wordpress/?p=4</guid>
		<description><![CDATA[Słowem wstępu Postaram się opisać na podstawie już wcześniej stworzonego programu (operacja na wektorach) jak przeładowywać w C++ podstawowe operatory. Postaram się skupić na samym przeładowaniu, bez wchodzenia w szczegóły samego działania. Operatory powinno się przeładowywać właśnie tam, gdzie ich działanie jest jednoznaczne na pierwszy rzut oka: działania arytmetyczne, operatory wejścia, wyjścia i inne, rzadziej [...]]]></description>
			<content:encoded><![CDATA[<h4>Słowem wstępu</h4>
<p>Postaram się opisać na podstawie już wcześniej stworzonego programu  (operacja na wektorach) jak przeładowywać w C++ podstawowe operatory.</p>
<p>Postaram się skupić na samym przeładowaniu, bez wchodzenia w szczegóły samego działania.</p>
<p>Operatory powinno się przeładowywać właśnie tam, gdzie ich działanie jest jednoznaczne na pierwszy rzut oka: działania arytmetyczne, operatory wejścia, wyjścia i inne, rzadziej używane o których wspomnę innym razem.<br />
<span id="more-4"></span><br />
Ogólną ideą która powinna przyświecać przeładowywaniu to tworzenie przewidywalnych, zachowujących się analogicznie jak te wbudowane operatorów.</p>
<p>Przeładowany operator to po prostu funkcja o nazwie operator z dopisaną końcówką charakteryzującą operator, np operator+, operator*= etc. Samą funkcje można zdefiniować na dwa sposoby:</p>
<ol>
<li>Jako funkcje składową klasy<br />
wtedy napisanie obiekt1+obiekt2 oznacza wywołanie: obiekt1.operator+(obiekt2)</li>
<li>Jako funkcje globalną<br />
wtedy napisanie obiekt1+obiekt2 oznacza wywołanie: operator+(obiekt1,obiekt2)</li>
</ol>
<h4>Operatory dodawania</h4>
<p>Występuje w kilku wariacjach:</p>
<h5>Zwykły operator dodawania:</h5>
<p>Założenia:</p>
<ol>
<li>Dodaje elementy tego samego/podobnego typu do siebie</li>
<li>Nie zmienia żadnego z elementów (żeby działało na obiektach stałych tak jak 2+5)</li>
<li>Wynik powinien być zwrócony przez wartość (gdyż obiekty wewnątrz funkcji utworzone mogą zostać zniszczone już po jej zakończeniu)</li>
</ol>
<p>Przykład:</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Vector <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy4">:</span></div>
</li>
<li class="li1">
<div class="de1">Vector &nbsp; &nbsp; &nbsp; &nbsp; operator<span class="sy2">+</span><span class="br0">&#40;</span><span class="kw4">const</span> Vector<span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span> &nbsp; &nbsp;<span class="kw4">const</span>;</div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">Vector &nbsp; &nbsp; &nbsp; &nbsp; operator<span class="sy2">+</span><span class="br0">&#40;</span><span class="kw4">const</span> Vector<span class="sy3">&amp;</span> lhs,<span class="kw4">const</span> Vector<span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Obie metody działają, natomiast zdecydowanie elegantsza wydaje się dla mnie być ta pierwsza, gdyż w gruncie rzeczy operator ten jest tak silnie związany z klasa że powinien być jej funkcją składową.</p>
<h5>Operator dodawania do lewej strony:</h5>
<p>Założenia:</p>
<ol>
<li>Dodaje elementy tego samego/podobnego typu do siebie</li>
<li>Zmienia element po lewej stronie (zwiększając go o wartość tego po prawej)</li>
<li>Wynik powinien być zwrócony przez referencje, tak aby wskazywał na właśnie przypisany obiekt. Zwracanie wyniku przez wartość byłoby nieefektywne z względu na pamięć (zbędne kopiowanie), natomiast ważne jest zwracanie w ogóle, aby poprawna była konstrukcja while( (i+=6)&lt;20 )</li>
</ol>
<p>Przykład, jako funkcja składowa (do takich będę się teraz ograniczał, ew zmiany są analogiczne jak powyżej)</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Vector <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy4">:</span></div>
</li>
<li class="li1">
<div class="de1">Vector<span class="sy3">&amp;</span> &nbsp; &nbsp; &nbsp; operator<span class="sy2">+</span><span class="sy1">=</span><span class="br0">&#40;</span><span class="kw4">const</span> Vector<span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Operator odejmowania czyli operator- i operator -= są analogiczne, przejde więc do operatorów mnożenia. Wektory można mnożyć na 3 sposoby: wektor*liczba, liczba*wektor, wektor*liczba, oraz wektor*wektor (skalarne).</p>
<h5>Mnożenie wektor*liczba</h5>
<p>Założenia:</p>
<ol>
<li>Mnoży wektor po <strong>lewej </strong>stronie razy liczbę</li>
<li>Zwraca nowy,przemnożony wektor</li>
<li>Zwraca oczywiście przez wartość</li>
</ol>
<p>Przykład:</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Vector <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy4">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;Vector &nbsp; &nbsp; &nbsp; &nbsp; operator<span class="sy2">*</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span><span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <span class="kw4">const</span>;</div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h5>Mnożenie wektor*=liczba</h5>
<p>Założenia:</p>
<ol>
<li>Mnoży wektor po <strong>lewej </strong>stronie razy liczbę</li>
<li>Zmienia lewą stronę wpisując wynik</li>
<li>Zwraca referencje do przemnożonego wektora (z tych samych przyczyn co operator+=)</li>
</ol>
<p>Przykład:</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Vector <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy4">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;Vector<span class="sy3">&amp;</span> &nbsp; &nbsp; &nbsp; &nbsp;operator<span class="sy2">*</span><span class="sy1">=</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span><span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Nie miałoby natomiast sensu napisanie: liczba*=wektor, gdyż takie działanie, teoretycnzie powinno liczbe zmienic na wektor, co jest niemożliwe. Pozostaje nam operator liczba*wektor. Ponieważ operator jako skladowa swoja klase musi mieć po lewej stronie, jedynym wyjściem jest utworzenie funkcji globalnej, spełniającej praktycznie te same założenia co wektor*liczba.</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">Vector operator<span class="sy2">*</span> <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span><span class="sy3">&amp;</span> lhs,<span class="kw4">const</span> Vector<span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Często aby moc korzystać z zmiennych prywatnych klasy Vector, takie funkcje nie deklaruje się poza ich ciałem, tylko wewnątrz definicji klasy jako funkcje zaprzyjaźnione:</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Vector <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">friend</span> Vector operator<span class="sy2">*</span> <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span><span class="sy3">&amp;</span> lhs,<span class="kw4">const</span> Vector<span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy4">:</span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Ostatni operator wart wymienia to proste mnożenie skalarne wektorów, którego przykład poniżej:</p>
<div class="geshi no cpp">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Vector <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy4">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;operator<span class="sy2">*</span><span class="br0">&#40;</span><span class="kw4">const</span> Vector<span class="sy3">&amp;</span> rhs<span class="br0">&#41;</span> &nbsp; &nbsp;<span class="kw4">const</span>;</div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Często dużo więcej można odczytać i zrozumieć z przykładowego kodu, dlatego poniżej zamieszczam w miarę dopieszczona klasę Vector <img src='http://kwesoly.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://download.kwesoly.net/2008/07/vector_sources.zip">Udokumentowane źródła klasy Vector</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/cpp/przeladowanie-operatorow-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

