🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by Piotr Gałka Sat, 09 Dec 2017 13:45
Treat enums as ints - czy to normalna praktyka
#309528
Author: Piotr Gałka
Date: Sat, 09 Dec 2017 13:45
71 lines
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
#309529
Author: Wojciech Muła
Date: Thu, 14 Dec 2017 18:19
10 lines
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