Zablokowane zostaną litery b B e E, gdyż wielkość liter nie gra tutaj roli. Rozmiar zmiennej keyString został ustawiony na 3, gdyż tylko trzy litery ma przechowywać, ustal ten rozmiar w zależności od liczby blokowanych liter, czyli rozmiar = liczba blokowanych liter + 1;
Zwracam uwagę na ten fragment: rozmiar = liczba blokowanych liter + 1;
Rozmiar tablicy musi być o jeden większy od liczby wprowadzonych znaków.
CodeGuard nie wskazał żadnych błędów gdyż testy przeprowadzałem z jednym blokowanym znakiem przy rozmiarze tablicy 3, więc wszystko było prawidłowo.
Po wprowadzeniu dwóch blokowanych znaków i rozmiarze tablicy 3, CodeGuard wskazuje błąd:
►
W pierwszym wątku podałem nieprawidłowy rozmiar tablicy, gdyż testy przeprowadzałem na jednym blokowanym znaku, potem tworząc wątek dodałem drugi znak bo w swoim pytaniu kurczez podał dwa znaki, więc chciałem być dokładny i dodałem drugi znak, zapominając o zmianie rozmiaru tablicy.
Byłem niedokładny i to wywołało te zgrzyty, być może wcześniej bym to zauważył, gdyby nie nieco ironiczna wypowiedź polymorphism. Prawidłowe rozwiązanie do mojego pierwszego wątku powinno oczywiście wyglądać tak:
- Kod: Zaznacz cały
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, wchar_t &Key)
{
wchar_t keyString[4];
keyString[0] = Key;
wcscpy(&keyString[1], L"b");
wcscpy(&keyString[2], L"e");
for(int i = 1; i < sizeof(keyString)/2; i++)
{
if(Key == keyString[i]) Key = NULL;
}
}
W pliku pomocy do C++Builder 2010 znalazłem taki oto przykład pod hasłem OnKeyPress - C++ Example:
- Kod: Zaznacz cały
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
wchar_t keyString[25];
keyString[0] = Key;
wcscpy(&keyString[1], L" Was àªà«à«¨à«ª Pressed");
TMsgDlgButtons() << mbOK;
MessageDlg(String(keyString), TMsgDlgType(mtInformation), TMsgDlgButtons() << mbOK, 0);
}
Jak widać autorzy środowiska nie zgłaszają zastrzeżeń do tej funkcji o ile prawidłowo się jej używa...
Nie tylko, ten błąd będzie występował wszędzie. Oczywiście konsekwencje mogą być różne, np. żadne, jak u Ciebie, lub takie jak u kurczeza - psucie stosu, czyli poważna sprawa. Witold wyjaśnił gdzie leży błąd.
Nie mogę się zgodzić z tym stwierdzeniem. Funkcja nie wywołuje żadnych błędów, działa poprawnie. Błąd wynika z nieprawidłowego zastosowania funkcji przez programistę.
Oczywiście w funkcji kryje się potencjalne niebezpieczeństwo przepełnienia bufora, gdy liczba znaków wprowadzanych do zmiennej jest równa rozmiarowi bufora, podczas gdy powinna być o jeden większa, tak jak to miało miejsce w przypadku podanego przeze mnie kodu jak i w przypadku kurczez, gdzie błąd nie wynikał bezpośrednio z funkcji, lecz ze sposobu w jaki została użyta. Gdyby jednak wszyscy przeczytali i przywiązali większą wagę do tego co napisałem w pierwszym wątku w tym poście, że rozmiar tablicy musi być o jeden większy od liczby blokowanych znaków, nie byłoby tej całej dyskusji. Tutaj muszę przyznać, że później ja sam nie zastosowałem się do własnych zaleceń. Jakoś mi to umknęło.




