Jak zablokować wciśnięcie klawisza?

Dyskusje na dowolny temat.

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 16:31

W sumie racja, można to było szybciej zapisać i równie zrozumiale. Niemniej dziękuje Baronowi za pomoc i rozumiem, że każdy ma jakieś swoje lepsze lub gorsze przyzwyczajenia w pisaniu kodu.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 16:46

Bo widzisz polymorphism sposób w jaki się wypowiadasz sprawia, że ludzie mogą przyjmować postawę agresywną wobec ciebie. Gdybyś zamiast pisać:

Panowie, litości!


To wyraźnie wskazuje, że masz o sobie wysokie mniemanie i innych traktujesz z góry, a to się akurat nie musi wszystkim podobać.

Mogłeś napisać:

Proponuję prostsze rozwiązanie.

W ten sposób wszyscy byliby ci wdzięczni.



Co się tyczy twoich propozycji to oczywiście jest to prostsze rozwiązanie, chociażby z tego powodu, że wyeliminowana została pętla, chociaż gdzieś tam w bibliotece funkcja strchr musi jednak przeglądać łańcuch znaków, tylko, że na pewno stosuje wydajniejszy algorytm niż pętla for.

Co do mojej propozycji, to pierwotnie testowałem to rozwiązanie w środowisku C++Builder 2010 i natknąłem się na problem z typem wchar_t, zacząłem kombinować i tak mi wyszło, szukałem analogicznej funkcji w stylu wcstrchr dla typu wchar_t ale takowej nie znalazłem, więc posłużyłem się inną znaną mi w tym środowisku funkcją. No, a potem to już jakoś tak poszło i po prostu na szybko przerobiłem kod dostosowując go do potrzeb środowiska C++Builder 2007.

Gdybym zastosował od razu rozwiązanie podobne do Twojego, problem zostałby szybciej rozwiązany, ale wtedy nie wyszłoby np. to, że funkcja strcpy w środowisku Turbo C++ nieprawidłowo przekazuje wartości, a tak kurczez już wie, że jeżeli kiedyś będzie potrzebował użyć funkcji strcpy to zamiast niej trzeba użyć strncpy i będzie już wiedział jak jej użyć, więc źle nie wyszło, a przy okazji można się czegoś nauczyć.



Co do C++Builder 2009 i 2010 to zajrzałem do helpa i funkcja, którą posądzałem o nazwę wcstrcht nazywa się nieco inaczej - wcschr.

Rozwiązanie problemu dla C++Builder 2009 i 2010:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, wchar_t &Key)
{
if(wcschr(L"łśćż", Key)) Key = NULL;
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez polymorphism » wtorek, 19 stycznia 2010, 18:09

To wyraźnie wskazuje, że masz o sobie wysokie mniemanie i innych traktujesz z góry,

Bez przesady. To można odwrócić w drugą stronę i powiedzieć, że jeśli ktoś ma o sobie (za)wysokie mniemanie, potraktuje moją uwagę jako atak, agresję, wszak podważam jego zdanie. Co do samej formy, miała być nieco ironiczna, no ale to nie powód do obrażania się. Inteligentny człowiek wyłapie ironię, jej intencję...

strchr musi jednak przeglądać łańcuch znaków, tylko, że na pewno stosuje wydajniejszy algorytm niż pętla for.

I tak, i nie. Tego typu proste funkcje biblioteczne implementowane są z reguły w asemblerze, więc będą (lub nie) nieznacznie szybsze od zwykłej pętli for. Jeśli chodzi o algorytm, przy tego typu zadaniu nic innego, efektywniejszego nie wymyślisz. Użycie strchr upraszcza implementację metody. A prostszy w zapisie kod jest łatwiejszy w analizie i wyłapywaniu potencjalnych błędów. Zasada KISS.

ale wtedy nie wyszłoby np. to, że funkcja strcpy w środowisku Turbo C++ nieprawidłowo przekazuje wartości, a tak kurczez już wie, że jeżeli kiedyś będzie potrzebował użyć funkcji strcpy to zamiast niej trzeba użyć strncpy

No widzisz, doszliście do złych wniosków ;) Bo strcpy działa jak należy, tylko użyliście jej w nieodpowiedni sposób:
Kod: Zaznacz cały
char keyString[3];
...
strcpy(&keyString[2], "ś");

widzisz błąd?

Użycie strncpy do kopiowania jednego znaku jest pozbawione sensu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 18:24


No widzisz, doszliście do złych wniosków ;) Bo strcpy działa jak należy, tylko użyliście jej w nieodpowiedni sposób:

Kod: Zaznacz cały
        char keyString[3];
        ...
        strcpy(&keyString[2], "ś");


widzisz błąd?

Użycie strncpy do kopiowania jednego znaku jest pozbawione sensu.


Nie widzę błędu. W C++Builder 2007 strcpy i wstrcpy w C++Builder 2010 działają bezbłędnie.

gdybym zapisał to tak: strcpy(keyString[2], "ś"); to byłby błąd.




ironia (łc. z gr. eironeía) ukryta kpina (drwina) z kogoś lub czegoś, ujęta m.in. w formę pozornego uznania, akceptacji, aprobaty.

Ironia, ukryte komiczne znaczenie negatywne, różniące się od dosłownego; pogarda wyrażona przy pomocy pozornej aprobaty. Czasami przybiera postać autoironii. Rozróżnia się różne rodzaje ironii, np. sokratyczną, tragiczną, romantyczną itp.

Hasło opracowano na podstawie „Słownika Wyrazów Obcych” Wydawnictwa Europa, pod redakcją naukową prof. Ireny Kamińskiej-Szmaj, autorzy: Mirosław Jarosz i zespół. ISBN 83-87977-08-X. Rok wydania 2001.



Wyłapałem ironię, ale co to zmienia. Czy napiszę, że traktujesz ludzi z góry, czy też, że kpisz z nich, czy też pogardzasz nimi - na jedno wyjdzie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez polymorphism » wtorek, 19 stycznia 2010, 20:54

Nie widzę błędu. W C++Builder 2007 strcpy i wstrcpy w C++Builder 2010 działają bezbłędnie.

Pozwól, że przytoczę kurczeza:
strcpy(&keyString[2], "ś"); // Po wykonaniu tej linijki kodu zmienna Key zmienia wartość z "f" na '\x01' :|


[...] dzieje tam się coś dziwnego. Nagle zmienna sama zmienia wartość.

błąd jest ewidentny, ma nawet swoje efekty uboczne 8-)

gdybym zapisał to tak: strcpy(keyString[2], "ś"); to byłby błąd.

Owszem, byłby błąd, ale składniowy.



Wyłapałem ironię, ale co to zmienia. Czy napiszę, że traktujesz ludzi z góry, czy też, że kpisz z nich, czy też pogardzasz nimi - na jedno wyjdzie.

Napisałem nieco ironiczna, to po pierwsze. Po drugie, nie chodzi o ludzi, tylko o sposób rozwiązywania problemu, o podejście. Rozprawialiście nad kodem, który jest po prostu kiepski, nieprzemyślany, nadmiernie pokomplikowany. O ile kurczezowi można to wybaczyć, to Ty, Baron, powinieneś już pewne rzeczy wiedzieć, przecież programujesz nie od dziś. Cieszysz się tu pewnym autorytetem, więc nie dziw się, że moje wymagania w stosunku do Ciebie są duże. Jeśli chodzi o kurczeza, powinien być nieco bardziej uważny, analizować to, co dostaje, bo jak widać, gotowe rozwiązania nie zawsze są dobre.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez polymorphism » wtorek, 19 stycznia 2010, 21:04

Odbijając piłeczkę zakładając, że nie jestem inteligentny bo nie załapałem ironii to czy człowiek, który wyśmiewa się z kogoś inteligencji jest inteligentny?

Odpowiem na to pytanie, jeśli pokażesz mi, gdzie wyśmiewam twoją inteligencję. Ok?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 21:08

błąd jest ewidentny, ma nawet swoje efekty uboczne 8-)


Nie czytasz uważnie błąd występuje tylko w Turbo C++.

Pozwól, że przytoczę kurczeza:

strcpy(&keyString[2], "ś"); // Po wykonaniu tej linijki kodu zmienna Key zmienia wartość z "f" na '\x01' :|


Owszem! W Turbo C++, w C++Builder 2007 i 2010 ten błąd nie występuje, zwracane są prawidłowe wartości
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 21:18

Odpowiem na to pytanie, jeśli pokażesz mi, gdzie wyśmiewam twoją inteligencję. Ok?


Na początku chce zaznaczyć, że rozumiem Twoje podejście, nie ma nic złego w poprawianiu kodu. Natomiast nie spodobało mi się to, że w swoich postach robisz z siebie gooru ośmieszając innych. Ja to akurat tak odebrałem, nie znam Waszych relacji.

Co do samej formy, miała być nieco ironiczna, no ale to nie powód do obrażania się. Inteligentny człowiek wyłapie ironię, jej intencję...


Zostało to tak napisane, jakoby my nie zrozumieliśmy ironii i dlatego mamy pretensje a jeśli nie zrozumieliśmy to nie jesteśmy inteligent ;)

Szykuje się Panowie temat rodem z forum gospodyń domowych ;)
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Witold » wtorek, 19 stycznia 2010, 21:20

Cyfrowy Baron napisał(a):Owszem! W Turbo C++, w C++Builder 2007 i 2010 ten błąd nie występuje, zwracane są prawidłowe wartości


Spróbuj włączyć CodeGuard'a. Próbowałeś przekopiować znak (jako cstring) do tablicy, począwszy od ostatniego elementu tablicy, ale strcpy kopiuje jeszcze znak 0 (znacznik końca cstring’u), i w ten sposób te zero zostało skopiowane za tablicą, możliwe że nadpisało przy okazji zmienną Key (u mnie tak wyszło). Tylko czemu u kurczez'a jest tam 1?. „// Po wykonaniu tej linijki kodu zmienna Key zmienia wartość z "f" na '\x01' ” ?
Ostatnio edytowano środa, 20 stycznia 2010, 00:19 przez Witold, łącznie edytowano 1 raz
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez polymorphism » wtorek, 19 stycznia 2010, 21:41

Natomiast nie spodobało mi się to, że w swoich postach robisz z siebie gooru ośmieszając innych.

Heh, zacytuj mnie ;)

Zostało to tak napisane, jakoby my nie zrozumieliśmy ironii i dlatego mamy pretensje a jeśli nie zrozumieliśmy to nie jesteśmy inteligent

Zostało to napisane na zachętę. Po to, żeby przemyśleć sprawę ponownie.



Nie czytasz uważnie błąd występuje tylko w Turbo C++.

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 21:47

Spróbuj włączyć CodeGuard'a


A oto log:
► 

Nie dostrzegam błędu. Sprawdzałem na różne sposoby, nie ma w tej zmiennej nic ponad to co tam wprowadziłem, więc nie rozumiem gdzie mam doszukiwać sie tego błędu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 21:56

Help dla C++Builder 2007:
► 

Dinkumware
► 

gdzie tu jest jakaś informacja o możliwości wystąpienia błędów o których piszecie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 22:21

Mam jeszcze jedno pytanie. Czy błąd o którym piszecie odnośnie użycia funkcji strcpy dotyczy również funkcji wcscpy?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez polymorphism » wtorek, 19 stycznia 2010, 22:35

W zasadzie tak.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Witold » wtorek, 19 stycznia 2010, 23:57

Cyfrowy Baron napisał(a):Nie dostrzegam błędu. Sprawdzałem na różne sposoby, nie ma w tej zmiennej nic ponad to co tam wprowadziłem, więc nie rozumiem gdzie mam doszukiwać sie tego błędu.



char keyString[3];

tablica keyString:
[0][1][2]

po:
strcpy(&keyString[2], "ś");

'ś' będzie w komórce [2] , 0 (znacznik końca cstring’u) poza tablicą.
gdyby było "char keyString[4];" byłoby OK.

u mnie CodeGuard wywala:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Dyskusje

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości