sobota, 3 marca 2012

"Legacy code" a możliwości C++

Być może niektórzy czytelnicy mojego bloga nieco "przestraszyli się" poprzednimi wpisami. Dzisiaj będzie coś łatwiejszego i mam nadzieję, że wiele osób będzie mogło wykorzystać w swoich projektach informacje zawarte w niniejszym wpisie już dziś.

W większych projektach bardzo często sięga się do bibliotek stworzonych przez osoby postronne. Ma to wiele zalet: oszczędzamy w ten sposób czas, spodziewamy się, że funkcjonalność zawarta w bibliotece jest napisana poprawnie, a wykorzystane algorytmy są optymalne itp. Jednakże często bywa, że znajdujemy świetnie nadającą się do naszego projektu bibliotekę, ale napisaną np. w języku C. Przykładowo funkcje tej biblioteki alokują pamięć na stercie, a dołączona dokumentacja informuje nas, że to my (jako użytkownicy biblioteki) powinniśmy pamiętać o jej zwolnieniu (za pomocą odpowiednich funkcji wchodzących w skład biblioteki). Dodatkowo używane funkcje mogą zakończyć się niepowodzeniem, co powinniśmy wykrywać za pomocą zwracanych przez nie wartości, bądź pilnować jakiejś globalnej flagi. Krótko mówiąc: typowa biblioteka napisana w języku C. A my lubimy C++... ;)

Zaprezentuję dziś na przykładzie, jak można radzić sobie przypadkami takimi jak opisany powyżej. Zapraszam do lektury.

piątek, 6 stycznia 2012

Metaprogramowanie - implementacja dużych liczb całkowitych (część 3)

Wtam po nieco dłuższej przerwie.

Powracamy do tematu metaprogrogramowania, a konkretnie do biblioteki manipulującej dużymi liczbami całkowitymi. Dziś ostatnia część - policzymy silnię liczby 100. Do obliczenia wyniku rozszerzymy naszą bibliotekę BigInteger, która potrafi już dodawać i mnożyć dowolnie duże liczby.

sobota, 12 listopada 2011

Metaprogramowanie - implementacja dużych liczb całkowitych (część 2)

Na początku listopada zapowiedziałem, że przedstawię metaprogram, który policzy liczbę 100!. Wszystko oczywiście już na etapie kompilacji. W części 1 stworzony został zalążek biblioteki BigInteger, umożliwiającej dodawanie dużych liczb całkowitych. Dziś rozszerzę tę bibliotekę o możliwość mnożenia.

Zaczniemy od napisania metafunkcji, która mnoży dowolną dużą liczbę całkowitą przez dowolną liczbę jednocyfrową. Zostanie ona później wykorzystania do mnożenia dowolnych dwóch dużych liczb całkowitych.

sobota, 5 listopada 2011

Serwer FTP

Dzięki uprzejmości kolegi, Michała, który użyczył mi trochę miejsca na swoim serwerze, będę do postów załączał całe pliki zawierające omawiany przeze mnie kod. Zaktualizowałem też wcześniejsze wpisy (linki do plików znajdują się na samym dole).

Zapraszam na blog Michała. :)

wtorek, 1 listopada 2011

Metaprogramowanie - implementacja dużych liczb całkowitych (część 1)

Ostatnio przypomniało mi się zadanie z pierwszego semestru studiów. Był to raczej klasyk dla uczących się języka C/C++: implementacja dużych liczb całkowitych. W moim przypadku chodziło konkretnie o policzenie liczby 100!. Prowadzący zaproponował nawet mały konkurs, polegający na jak najefektywniejszej implementacji arytmetyki (zwyciężyć miała osoba, której program najszybciej obliczy wynik), jednak jeśli mnie pamięć nie myli, to do niego nie doszło. ;)

Tak sobie pomyślałem, że można by się tu pokusić o małe oszustwo i policzyć wynik już na etapie kompilacji, a po uruchomieniu programu tylko go wyświetlić. Tego rodzaju programowanie nazywa się metaprogramowaniem.

Mając dziś trochę wolnego czasu, zacząłem pisać bibliotekę do obliczeń na dużych liczbach całkowitych wykonywanych w trakcie kompilacji programu. Ponieważ całość implementacji jest zbyt duża na pojedynczy wpis na blogu, podzielę ją na kilka części i omówię osobno. Końcowym efektem będzie obliczenie liczby 100! w trakcie kompilacji.