096 TIF

096 TIF



DWORD fWyn4:1;

DWORD dwNieużyw:23;

};

#ifdef _DEBUG

char szAsercjaStałyRozm[sizeof(DWORD)-sizeof(StałyRozm)+1];

#endif //DEBUG

Często zależy nam na tym, aby rozmiar struktury lub klasy mieścił się w pewnym określonym zakresie. Moglibyśmy na przykład utworzyć klasę węzłów w drzewie lub w innej strukturze danych i upewnić się, że rozmiar węzłów mieści się w pewnej wielkości albo w celu ich wyrównywania albo w celu zapewnienia, że zużycie pamięci nie jest zbyt duże. We fragmencie „Przed” utworzyliśmy strukturę o rozmiarze DWORD. Planujemy przydzielenie kilkuset tysięcy egzemplarzy tej struktury, więc chcemy się upewnić, że struktura nie przekroczy rozmiaru typu DWORD po dodaniu kilka pól bitowych lub składowych.

Po policzeniu liczby bitów widzimy jednak, że popełniliśmy błąd, wybierając rozmiar pola dwNieużyw. Cała struktura ma 33 bity, czyli więcej niż rozmiar typu DWORD (32 bity). Nawet jeśli nasz komentarz mówi nam, że sprytnie zdefiniowaliśmy naszą strukturę, to jednak mamy w niej błąd.

We fragmencie „Po” przekroczenie rozmiaru jest wykrywane za pomocą pewnej sztuczki. Przydzielamy pamięć dla tablicy o liczbie elementów równej rozmiarowi wymaganej struktury zmniejszonej o rzeczywisty rozmiar struktury. Jeśli tworzona struktura przekracza wymagany rozmiar, wówczas jest przydzielana tablica o niedodatnim rozmiarze. (W naszym przykładzie funkcja sizeof(StałyRozm) zwraca wartość 5, więc 4-5+l=0.) Powoduje to błąd kompilacji. Jeśli zaś tworzona struktura mieści się w wymaganym rozmiarze, to alokowana tablica ma długość dodatnią i nie otrzymujemy błędu.

Zauważmy, że sprawdzenie to jest wykonywane tylko w trakcie kompilacji testowej, dzięki czemu nie dołączamy tworzonej tablicy do ostatecznej wersji kodu.

Przykład: klasa FixedSize w pliku regexp.cpp

Dziedziczenie zamiast unii

unikanie awarii; unikanie nieoczekiwanych wyników

Przed

class uKlasa

{

public:

uKlasa() : nldNaucz(O), fltPensja(0.)

{

}


Wyszukiwarka

Podobne podstrony:
5 220055 tif 160 KSIĘGA PRZYSŁÓW 19, 23-27 23    Bojaźń Jahwe zapewnia życie, wt
RYS13 TIF Flash 5 - [Preloader]File Edit View Control Debug Window Help -
039 TIF Po #define CZYSTE =0; virtual BOOL FOtwórz(const char *szTekst) CZYSTE; Zdarzają się sytuacj
069 TIF *ppch = &ch; //błąd **ppch = ch;} void TestConstConst3( char const**ppch){ char ch; *ppc
38 (23) Bodę Diagram Char. Bodego - UZ Zachowaj poprzednie Typ regulatora: PD Frequency
238 TIF 0040F12A shr eax,5 0040F12D mov dword ptr [idw],eax */ idw = ibit / cbitDWORD; if(m_rgdw[idw
253 TIF void SetCMinMax(DWORD cdwMin, DWORD cdwMax){ m_ri = riMinMax; // Sprawdzenie granic. Przepro
238 TIF 0040F12A shr eax,5 0040F12D mov dword ptr [idw],eax */ idw = ibit / cbitDWORD; if(m_rgdw[idw
0040EDA1 sar 0040EDA4 mov ecx,5 dword ptr [ebp-OCh],ecx return 0; } Kod, który zostaje wygenerowany
096 3 188 a >rese t clock N >- N Rys.6.23. Uproszczony schemat układu sterowania zamkiem szyfr

więcej podobnych podstron