Thread View: pl.comp.lang.c
2 messages
2 total messages
Started by Piotr Gałka
Sat, 09 Dec 2017 13:45
Treat enums as ints - czy to normalna praktyka
Author: Piotr Gałka
Date: Sat, 09 Dec 2017 13:45
Date: Sat, 09 Dec 2017 13:45
71 lines
4821 bytes
4821 bytes
Jestem niedzielnym programistą (Builder). Nigdy nie korzystałem świadomie z bibliotek napisanych przez kogoś innego (wiem, że to prawie nienormalne). Jakiś czas temu, jak zwykle biegiem i na szybciutko potrzebowałem dołożyć obsługę urządzenia przez winusb. To pierwszy przypadek, gdy na liście plików mojego projektu znalazł się jakiś nie mój plik .lib. Udało mi się, zadziałało i zostało odłożone i zapomniane. Wczoraj potrzebowałem skomunikować się z innym urządzeniem winusb. Komunikację chciałem dołożyć do programu, który napisałem w 2010r dlatego nie zacząłem od kopii tego projektu działającego z winusb tylko przeniosłem plik .cpp obsługi tego urządzenia do tego starego projektu. No i zmarnowałem pół dnia - źle mi rozpoznawało dostępne Pipe. A że było kilka zmian: - mój program inny, - chyba tamto mi działało pod XP, a teraz WIN7, - oprogramowanie tego urządzenia też jest jeszcze nie sprawdzone. Ponieważ skopiowanego cpp w tym fragmencie początkowego rozpoznania urządzenia nie modyfikowałem więc zafiksowałem się, że przyczyna błędu musi być zewnętrzna. Po spięciu z bratem, który napisał program do urządzenia okazało, się, że coś tam zrobił inaczej i Pipe 1 ma dwukierunkową, a ja widzę w moim programie, że biorę każdą Pipe po kolei i ustalam czy jest IN, czy OUT ale nie ma możliwości, że w dwie strony (to jest kopia jakiegoś standardowego przykładu). Moja hipoteza - może w USB można dwukierunkowo, ale może w winusb tego nie przewidzieli. Zmienił mi tak jak było w tym urządzeniu co kiedyś tam mi działało i .... nie pomogło - dalej to samo - mój program znajduje dwie Pipe, ale obie są OUT. No to zacząłem szukać problemu z WIN7. Znajduję, że trzeba dograć jakieś winusb.sys, i nawet jakieś opisy jak to zrobić, ale dla mnie niejasne i nie znalazłem nigdzie tych plików co miałyby do tego służyć. Wymyśliłem też, że może dla winusb.dll muszę wygenerować nowe .lib. Nigdy tego nie robiłem, ale doszedłem do tego jak to zrobić - sprawdziłem kilka kombinacji przełączników przy generowaniu lib ale nadal nic. Zrobiła się 21 i odłożyłem sobie to na dziś. Przespałem się z problemem i mnie olśniło, że zmiana z XP na WIN7 to jednak chyba była wcześniej niż tamto co mi działało. Dziś sprawdziłem, że faktycznie więc wyszło na to, że to jednak u mnie coś nie halo. Odkryłem. Okazuje się, że koniecznie w projekcie muszę mieć włączoną flagę "Treat enum types as ints". A w tym projekcie do którego skopiowałem to moje cpp nie miałem tej flagi, a skąd wtedy wiedziałem, że mam ją tam włączyć to nie pamiętam - próbowałem trochę pogooglać, czy gdzieś enum i winusb się razem pojawią, że może gdzieś widziałem taki komentarz, ale nie znalazłem. Tak samo w plikach .h związanych z tą winusb.lib też nie znalazłem takiej wzmianki. Mi się wydaje, że jakiekolwiek biblioteki to powinny być tak pisane aby reprezentacja jakichkolwiek danych nie zależała od jakiejś tam flagi. Chyba da się to tak napisać. Czy się mylę? A jeśli się nie da to chyba w każdym pliku .h powinno na samym początku być większą czcionką i BOLD :) napisane. Na stronach microsoftu znajdowanych zaczynając od hasła WINUSB_PIPE_INFORMATION też nie znajduję niczego co by mnie naprowadziło na źródło problemu. Może w przyszłości zdarzy mi się jeszcze jakiejś biblioteki użyć i dlatego pytanie do tych, którzy korzystali z obcych bibliotek. Czy to jest standard, że dla każdej biblioteki muszę skądś wiedzieć jak poustawiać flagi kompilacji, czy miałem wyjątkowego pecha, że trafiłem na taką wredną, co zamiast określić jednoznacznie rozmiar składowych struktury to zrobiła to zależnie od flag kompilacji? P.G.
Re: Treat enums as ints - czy to normalna praktyka
Author: Wojciech Muła
Date: Thu, 14 Dec 2017 18:19
Date: Thu, 14 Dec 2017 18:19
10 lines
1803 bytes
1803 bytes
On Saturday, December 9, 2017 at 2:45:50 PM UTC+1, Piotr Gałka wrote: > Czy to jest standard, że dla każdej biblioteki muszę skądś wiedzieć jak > poustawiać flagi kompilacji, [...] Standard dla C++. To znaczy akurat brak w standardzie. :) Idealna sytuacja to mieć źródła bibliotek i kompilować je używając swoich ustawień. w.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads