Boost – kompilacja i przygotowanie pod Visual C++

March 9th, 2012 1 comment

Jezeli chodzi o Linuksa, to na takie problemy, zaden developer napotkac nie powinien, wystarczy zainstalowanie odpowiedniej paczki dev w systemie i problem z glowy. Jezeli natomiast chodzi o system Windows, sprawa wyglada troche gorzej jednak tez nie tragicznie. :) Pierwsze czego potrzebujemy to samej paczki z zrodlami boosta, ktore to mozna pobrac z oficjalnej strony internetowej projektu badz tez bezposrednio ze strony pobierania. Sprawa jest dosc banalna, rozpakowujemy archiwum do dowolnego katalogu, nastepnie uruchamiamy linie polecen, przchodzimy do katalogu z boostem:
cd katalog/jakis/boost_1_48_0
nastepnie wykonujemy dwa polecenia:
> bootstrap
> b2
Nastepnie nalezy odpowiednio skonfigurowac Visual Studio, tak aby dodac katalog/jakis/boost_1_48_0 do Include Directories natomiast katalog/jakis/boost_1_48_0/stage/libs do Library Directories. To wszystko! Wiecej na temat samej biblioteki mozecie znalezc w jezyku polskim w artykule na wikipedii. Mam nadzieje, ze niedlugo na moim blogu pojawia sie jakies przyklady z wykorzystaniem tej biblioteki.

Kontenery sekwencyjne: std::vector

November 3rd, 2011 No comments

Kontenery tego typu charakteryzują się tym, że elementy przez nie przetrzymywane zachowują kolejność. Najczęściej wykorzystywanym kontenerem tego typu wydaje się być std::vector, jednak każdy typ kontenera ma inne właściwości i specjalizacje.
Read more…

Categories: Tutoriale Tags:

Kontenery STL w C++

November 3rd, 2011 No comments

Tym wpisem rozpoczynm serię tekstów o kontenerach, które są częścią standardowej biblioteki C++ (STL). Mam nadzieję, że będę w stanie przybliżyć niektórym ten temat lub też coś dokładniej wyjaśnić. Kolejne artykuły z tej serii powinny ukazywać się w miarę regularnie. A więc zacznijmy, kontenery, są to klasy mające za zadanie gromadzenie innych obiektów, podobnie jak tablice. Mają jednak tą przewagę, że dbają za nas o alokacje pamięci a także potrafią dynamicznie dostosowywać swój rozmiar w zależności od potrzeb. Kontenery dzielimy na trzy główne grupy:

  • sequence containers – kontenery sekwencyjne
  • associative containers – kontenery asocjacyjne
    • set
    • multiset
    • map
    • multimap
    • bitset
  • container adaptors – adaptery kontenerów
    • stack
    • queue
    • priority_queue
Categories: Tutoriale Tags: , , , , ,

[C++] auto_ptr

September 5th, 2011 No comments

auto_ptr jest częścią standardowej biblioteki C++, jak po części nazwa wskazuje, jest to “wskaźnik”, a właściwie “inteligetny wskaźnik”. Jego funkcjonalnosc, mimo, ze prosta jest nader przydatna. Jest to klasa szablonowa, ktora zachowuje sie tak jak zwykly wskaznik (posiada przeciazone operatory -> oraz *). Aby moc skorzystac z tego szablonu, musimy dolaczyc naglowek <memory>. Zaleta i glowna cecha auto_ptr-a jest to, ze kiedy wyjdziemy ze scope’a obiekt, na ktory wskazuje aut_ptr zostanie automatycznie zwolniony. Oto maly przyklad:

#include <iostream>
#include <memory>

class A
{
public:
	A()
	{
		std::cout << "A ctor" << std::endl;
	}

	~A()
	{
		std::cout << "A dtor" << std::endl;
	}
};

int main ()
{
	std::auto_ptr<A> pA (new A);
	return 0;
}

Po uruchomieniu tego programu, zauwazymy, ze bez jawnego wywolywania operatora delete obiekt zostal usuniety. auto_ptr różni się jednak od zwykłego wskaźnika operacją przypisania. Kiedy przypisujemy auto_ptr B do A, wtedy auto_ptr B traci prawo do posiadania obiektu i przekazuje go do A.

int main ()
{
	std::auto_ptr<A> pB (new A);

	std::cout << "pB.get() == " << pB.get() << std::endl;
	std::cout << "transferring ownership to pA..." << std::endl;

	std::auto_ptr<A> pA (pB);

	std::cout << "pB.get() == " << pB.get() << std::endl;
	std::cout << "pA.get() == " << pA.get() << std::endl;

	return 0;
}

Wynik jest oczywisty, po takiej operacji pB nie nadaje sie juz do uzywania az do kolejnego przypisania a obiekt przez niego wczesniej wskazywany jest teraz posiadany przez pA. Nalezy o tym pamietac! Ze wzgledu na te wlasciwosc, aut_ptr nie powinien byc wykorzystywany jako element kontenera. Kolejna rzecza, o ktorej musimy pamietac jest to, ze nie mozemy do auto_ptr-a przypisywac tablicy, gdyz do usuwania obiektu auto_ptr wykorzystuje zwykly operator delete – nie tablicowy.

Poza wczesniej wykorzystana metoda auto_ptr::get() posiada on jeszcze dwie inne interesujace a mianowicie:

  • void auto_ptr::reset(T * = 0) – zwalnia zaalokowana pamiec i przypisuje nowy obiekt,
  • T* auto_ptr::release() – jedynie zwalnia obiekt z posiadania auto_ptr-aoraz NULL-uje go (nie dealokuje pamieci). Zwraca wskaznik na aktualnie posiadany obiekt, ktory to pozniej musimy usunac sami.

Obiekty funkcyjne, wstęp

September 2nd, 2011 No comments

Dzisiaj będzie o obiektach funkcyjnych (inaczej funktorach), ideą ich wprowadzenia jest “poprawienie” wad wskaźników na funkcje. Same obiekty funkcyjne zachowują się bardzo podobnie do tychże wskaźników jednak ich “implementacj” i zasada działania jest trochę inna. Do stworzenia funktora wykorzystamy przeciążony operator ():

struct funkcja
{
    virtual void operator()() const
    {
        std::cout << "Funckja!" << std::endl;
    }
};

W tym momencie mamy zadeklarowany obiekt funkcyjny. Aby z niego skorzystac musimy go zainstancjonować, kiedy posiadamy już instancje obiektu funkcyjnego, możemy z niego korzystać jak ze zwyklej funkcji bądź tez wskaźnika na nią:

// instancja obiektu funkcyjnego
funkcja f;

// wywołanie funkcji
f();

taki obiekt może zostać przekazany do innej funkcji np. w taki sposób:

void do_10_times(const funkcja &f)
{
	for (int i = 0; i < 10; i ++)
	{
		f();
	}
}
// ....
funkcja f;

// przekazanie istniejacego obiektu
do_10_times (f);
// utworzenie i wykorzystanie obiektu tymczasowego
do_10_times (funkcja());

Zaletą obiektów funkcyjnych jest też to, że mogą posiadać stan. Możemy przerobić nasz obiekt funkcyjny w taki sposób aby można było zmienić jego zachowanie:

struct funkcja
{
	funkcja () : _value ("Funkcja!") {}
	funkcja (const std::string &str) : _value (str) {}

	virtual void operator()() const
	{
		std::cout << _value << std::endl;
	}

private:
	std::string _value;
};

// ...
// wywołanie domyślnego konstruktora
funkcja f1;
f1();

// zmiana zachowania obiektu funkcyjnego poprzez przekazanie parametru wkonstruktorze
funkcja f2("Hello world!");
f2();

Tutaj właściwie tylko wyobraźnia nas ogranicza. :) Kolejną istotną cechą funktorów, wynikającą z polimorifzmu w C++ jest to, że po takich obiektach możemy dziedziczyć, tworząc pewne klasy funkcji.. są to przecież zwykłe klasy, nic więcej.

struct funkcja2 : public funkcja
{
	funkcja2 () : _second ("Funkcja2!") {}
	funkcja2 (const std::string &a, const std::string &b) : funkcja (a), _second (b) {}

	virtual void operator()() const
	{
		std::cout << _value << " " << _second << std::endl;
	}

protected:
	std::string _second;
};

//...

// wywołanie domyślnego konstruktora
funkcja2 f2;

f2();

funkcja2 f22("jakis", "tekst");
f22();

do_10_times (f22);

Na koniec zostawiłem sobie jeszcze jeden temat, mianowicie jak napisać generyczną funkcję przyjmującą jako parametr każdy obiekt funkcyjny bądź też wskaźnik na funkcję. Tutaj z odsieczą przychodzą nam szablony, rozwiązanie jest proste, przeróbmy zatem naszą funkcje do_10_times:

template <typename Fn>
void do_10_times(Fn f)
{
	for (int i = 0; i < 10; i ++)
	{
		f();
	}
}

void other_func()
{
	std::cout << "Zwykła funkcja" << std::endl;
}

int main ()
{
	do_10_times (funkcja());
	do_10_times (funkcja2());
	do_10_times (other_func);

	return 0;
}

Biblioteka STL jak i boost dość często wykorzystuje ten mechanizm. I na koniec mała ciekawostka, jezeli skorzystamy z powyzszego mechanizmu to może okazać się, że obiekty funkcyjne będą bardziej wydajne, gdyz kompilator potrafi z-inline-owac nasz funktor (funkcja) do wyspecjalizowanego szablonu funkcji (do_10_times), omijając w ten sposób wywołanie. Ze wskaźnikami taka operacja optymalizacji byłaby niemożliwa.

Resurrection

September 2nd, 2011 No comments

Cześć! Długo już nic nie pisałem, niestety wynikało to z braku czasu, który musiałem poświęcic na sprawy służbowe. Mam teraz pomysł na kilka kolejnych tekstów a już na pewno chcę sie zmobilizować na większą częstotliwość dodawania wpisów! Jeżeli macie jakieś pomysły co do tematów – piszcie.

Categories: Njusy Tags:

Arduino: Pozbyć się Arduino IDE

November 20th, 2010 No comments

Na pewno niejeden z Was zastanawiał się, czy może pozbyć się środowiska Arduino i nadal być w stanie programować mikrokontroler na płytce. Wg. mojej opini środowisko programistyczne Arduino jest nieco toporne i ciężko rozwijać w nim większe projekty. Oczywiście jest możliwość aby to zmienić i to nawet bardzo prosta! Read more…

LUA w C++: API dla skryptów

June 27th, 2010 No comments

Dzisiaj coś bardziej przydatnego, będzie to prosty host dla skryptów napisanych w LUA, udostępniający szereg funkcji.
Read more…

Categories: Tutoriale Tags:

LUA w C++: Wstęp

June 25th, 2010 No comments

Cześć,
dzisiaj postanowiłem napisać coś o LUA a dokładniej jak wykorzystać ten język do rozszerzenia własnych aplikacji. Co to takiego jest właściwie ta LUA zapewne już wiesz skoro tu trafiłeś. Jeżeli jednak nie to po krótce: LUA jest to język programowania, którego dzięki dostarczonym bibliotekom możemy w prosty sposób wykorzystać w naszych programach do takich rzeczy jak skrypty i pluginy.
Read more…

Categories: Tutoriale Tags:

Symulator mikrokontrolera 8051

May 4th, 2010 3 comments

Cześć!
Dawno nic nie pisałem, jakoś zabrakło czasu. Ostatnimi czasy pracuję nad projektem na uczelnię, jednak projekt ten wydał mi się na tyle ciekawy, że będę rozwijał go przez – mam nadzieję – dłuższy czas i wzbogacał program o dodatkowe funkcje. Z założenia, miał on jedynie symulować wykonywanie instrukcji mikroprocesora, jednak już teraz dorobił się GUI, prostego disassemblera oraz kilku innych ciekawych funkcji. Jeżeli ktoś jest zainteresowany to stronę projektu można znaleźć pod adresem: https://sourceforge.net/projects/sim51/. Jeżeli ktoś jest zainteresowany i chciałby pomóc w rozwoju tego programu to czekam na kontakt. ;-)

Categories: Devblog Tags: