Entries for tag "c++", ordered from most recent. Entry count: 151.
# CommonLib 8.0 !!!
Sat
29
Mar 2008
Moja jedna z największych, a na pewno najbardziej użyteczna z produkcji - ogólnoprogramistyczna biblioteka do C++ - doczekała się zupełnie nowej wersji: CommonLib 8.0. Najważniejsze nowości, to:
Comments | #productions #libraries #c++ Share
# Elementarne algorytmy
Tue
25
Mar 2008
float t; for (uint i = 0; i < Count; i++) { t = (float)i / (float)(Count - 1); Foo(t); }
Czy da się ten kod napisać lepiej? Ano da się. Zamiast wyliczać zmienną t
za każdym razem na podstawie i
, można ją zwiększać niezależnie:
float t = 0.0f, t_step = 1.0f / (float)(Count - 1); for (uint i = 0; i < Count; i++, t += t_step) Foo(t);
Dla niektórych to oczywiste, ale każdy musiał się tego skądś nauczyć albo samemu wymyślić. Ja mam na to nazwę "elementarne algorytmy" i uważam, że takich rzeczy nie powinno się poznawać gdzieś przy okazji, ale porządnie spisać i nauczać początkujących programistów.
Mam nawet spisane pomysły na ponad pół setki takich drobiazgów, które możnaby opisać i zacząłem to robić w czasie wakacji 2007 jako nowa wersja mojego artykułu "Struktury danych i formaty plików" (nowy tytuł to "Brakujące ogniwo"), ale dokładne opisanie i zilustrowanie tego wszystkiego przerosło moje możliwości :)
Comments | #c++ #algorithms #teaching Share
# Konwencja pisania kodu
Tue
26
Feb 2008
W nowym, utworzonym przeze mnie dziale forum - Porady - dwie osoby zdecydowały się założyć temat poświęcony czytelności kodu i komentarzy - [1], [2]. Wyniknęły z tego ciekawe dyskusje na tematy, które dotyczą każdego programisty:
/* */
aby można było obejmować w nie większy fragment kodu, czy większe fragmenty wyłączać dykrektywą #if 0
?
Właściwie to staram się tylko obserwować, jak wygląda podejście profesjonalistów do tych spraw, ale z jedną rzeczą w obecnej chwili pogodzić się nie potrafię. Nie wierzę, że dobry kod potrafi się sam w pełni opisać bez komentarzy. Dla mnie bardzo ważne jest, żeby w nagłówku opisane były w komentarzu przed metodą czy polem wszystkie ważne informacje, takie jak:
Ale programista uczy się przez całe życie. Za kilka miesięcy będę się pewnie wstydził tej notki :)
# Metoda szablonowa zamiast rzutowania
Tue
29
Jan 2008
Wpadłem ostatnio na pomysł, żeby się z wami podzielić drobnym rozwiązaniem, które wymyśliłem i które stosuję od dawna w swoim kodzie. Jako przykład weźmy manager zasobów. U mnie jest jeden ogólny, a każda klasa zasobu dziedziczy ze wspólnej klasy bazowej IResource. Są więc klasy pochodne takie jak D3dTexture czy FmodSound. Zasobów używam przez wskaźnik, ale ponieważ ich lista jest zapisana w pliku tekstowym, trzeba taki wskaźnik najpierw pobrać na podstawie nazwy. Trzeba przy tym zrzutować otrzymany zasób w dół na określony typ pochodny. Można to zrobić tak:
res::D3dTexture *Tex = (res::D3dTexture*)res::g_Manager->MustGetResource(L"Potwór01"); Tex->Cośtam();
lub bezpieczniej ze względu na typ:
res::D3dTexture *Tex = dynamic_cast<res::D3dTexture*>(res::g_Manager->GetResource(L"Potwór01")); if (Tex == NULL) throw Error(...); Tex->Cośtam();
Mój pomysł polega na napisaniu metody szablonowej, która ukryje rzutowanie:
template <typename T> T * MustGetResourceExf(const wstring &Name) { return static_cast<T*>(MustGetResource(Name)); }
I jej wersji wolniejszej ale bezpieczniejszej:
template <typename T> T * MustGetResourceEx(const wstring &Name) { IResource *R = MustGetResource(Name); if (typeid(*R) != typeid(T)) throw Error(...); return static_cast*lt;T*>(R); }
Używa się ich tak:
res::D3dTexture *Tex = res::g_Manager->MustGetResourceEx<res::D3dTexture>(L"Potwór01"); Tex->Cośtam();
Prawda, że bardziej eleganckie? :) Gdyby ktoś pytał, przedrostek "Must" oznacza u mnie, że w przypadku nieznalezienia zasobu o podanej nazwie rzucony zostaje wyjątek, w przeciwieństwie do metod bez niego, które w takim przypadu zwracają NULL.
Comments | #c++ #algorithms Share
# Visual C++ a procesor dwurdzeniowy
Thu
13
Dec 2007
Jako szczęśliwy posiadacz maszyny z dwurdzeniowym procesorem postanowiłem pomyśleć o przyspieszeniu kompilacji w Visual C++ 2005 i oto, do czego doszedłem po "dialogu" z Google.
Po pierwsze zła wiadomość: Visual C++ nie potrafi kompilować równolegle wielu plików. Właściwie to potrafi (za liczbę równoległych kompilacji odpowiada ustawienie Tools > Options > Projects and Solutions > Build and Run > maximum number of parallel project builds), ale tylko kiedy kompilujemy na raz wiele projektów z jednej solucji.
Po drugie, znalzłem coś takiego: IncrediBuild. Niestety, to jest program płatny, a w dodatku służy raczej do rozpraszania kompilacji na wiele komputerów. Nie o to nam chodzi.
Po trzecie, istnieje mały i darmowy dodatek do Visual C++ zrównoleglający kompilację na wiele plików jednocześnie - MPCL. Wypróbowałem go.
Po czwarte i najważniejsze, istnieje przełącznik kompilacji /MP, który sprawia, że Visual C++ automatycznie zrównolegla kompilację pojedynczego pliku znacznie ją przyspieszając. Nie znajdziesz tego przełącznika jako pozycji na listach opcji projektu. Musisz go ręcznie dopisać w C/C++ > Command Line > Additional Options. Też go sprawdziłem.
Oto wyniki moich eksperymentów. W trybie Release kompilacja trwa o wiele dłużej, bo dochodzi stały, duży czas linkowania, którego nie da się zrównoleglić.
Wnioski: 1. Użycie przełącznika /MP daje duże przyspieszenie kompilacji. 2. Użycie programu MPCL nie daje dalszego przyspieszenia, choć zastosowanie jego samego, bez przełącznika /MP, również przyspiesza kompilację tak jak ten przełącznik.
Wniosek wniosków: Programu MPCL nie warto instalować, natomiast warto zawsze stosować przełącznik /MP, bo znacznie przyspiesza kompilację na maszynie wielordzeniowej.
Comments | #visual studio #c++ Share
# Visual Studio 2008 Express
Mon
26
Nov 2007
Przyglądałem się dzisiaj nowym wersjom narzędzi programistycznych Microsoftu. Konkretnie, ściągnąłem i zainstalowałem Visual C++ Express 2008 oraz Visual C# Express 2008. Patrząc na tabelkę, darmowym wersjom Express niewiele brakuje do pełnego Visual Studio i jeśli tylko nie potrzebujesz możliwości takich jak Mobile Development czy 64-bit Compiler Support, powinny wystarczyć.
Nowości jest dużo. Większość z nich to jednak sprawy związane z Internetem, stronami WWW i bazami danych, dlatego nie zagłębiałem się w to dalej. Pośród ciekawych rzeczy, nowe wersje języka C# 3.0 i platformy .NET 3.5 wprowadzają mechanizm LINQ (coś jakby zapytania SQL, które można zadawać w kodzie C# do dowolnej kolekcji obsługującej enumerację) oraz słowo kluczowe var, które powoduje automatyczne zgadnięcie typu podczas kompilacji (C++ ma to mieć w standardzie planowanym na rok 2009). Jest też kilka technologii, którym będę się musiał przyjrzeć kiedyś bliżej - np. Windows Presentation Foundation czy DarkGDK.
Pośród nowości w Visual C++ nie zauważyłem niczego istotnego. Zaletą jest, że nowa wersja zawiera w sobie już wszystkie nagłówki i biblioteki Windows API, więc nie trzeba męczyć się z osobnym ściąganiem i instalowaniem Platform SDK. Na szczęście niczego też nie popsuli. Kompilowane pliki EXE wymagają wprawdzie nowej wersji plików DLL z biblioteką standardową typu MSVCP90.DLL, którego użytkownicy na swoich komputerach nie mają, ale tak jak dawniej wystarczy przestawić w opcjach projektu Runtime Library, żeby problem zniknął.
Do tego wszystkiego niezbędna jest dokumentacja, którą również sobie ściągnąłem i zainstalowałem (nie ma to jak szybka Neostrada :D). MSDN Library for Visual Studio 2008 dostępne jest za darmo. Zawiera oczywiście dokumentację nowych funkcji systemowych (Vista, nowa platforma .NET itd.), ale poza tym wygląda i działa jak dawniej.
Żeby powiedzieć coś więcej, musiałbym dłużej tych programów poużywać. Wstępnie odnoszę wrażenie, że nowe wersje rewolucji nie robią, ale są OK. Przesiadka nie jest niezbędna. Ja bym się przesiadł, gdyby nie to, że jestem szczęśliwym posiadaczem pełnego Visual Studio 2005 Professional. W takiej sytuacji bez żalu zostaną przy wersji z sprzed dwóch lat.
Comments | #visual studio #c++ Share
# CommonLib 7.0
Sat
03
Nov 2007
Od mniej więcej pół roku pisałem swój silnik od nowa. Bibliotekę modułów bazowych, której obecną postać piszę od 1.5 roku, przez cały ten czas rozwijałem. Dlatego teraz pora opublikować zmiany jako CommonLib 7.0.
Przypominam, że jest to mój pakiet źródeł C++ na licencji GNU LGPL, działających na Windows i Linux, który zawiera kilka modułów przydatnych w programowaniu tak ogólnie, jak i przede wszystkim gier. Pośród nich warto szczególnie zwrócić uwagę na funkcje matematyczne, bo to w nich najwięcej dopisałem i zmieniłem w nowej wersji.
Comments | #productions #libraries #c++ Share
# Hello Scene !
Mon
24
Sep 2007
Poczytałem trochę o demoscenie i napisałem swoje pierwsze intro 4k. Nie jest wprawdzie zbyt ambitne, bo pokazuje tylko trójkąt, ale na początek dobre i to :) Najlepsze, że zajmuje tylko 1082 bajty. Do pobrania: HelloScene.exe.