|
Forum - Polski Portal COLOBOTa |
|
|
Bugi, nieprzenośny kod, dziwne rzeczy w kodzie |
Autor |
Wiadomość |
piotrdz
Twoja ulubiona misja: programowanie ;)
Pomógł: 1 raz Dołączył: 17 Mar 2012 Posty: 55 Skąd: Częstochowa
|
Wysłany: 19-03-2012, 17:37 Bugi, nieprzenośny kod, dziwne rzeczy w kodzie
|
|
|
Jak pisałem już w moim poprzednim wątku, zobaczyłem jak wygląda sprawa z kompilacją kodu pod GCC. Znalazłem przy tym wiele dziwnych konstrukcji, potencjalnych bugów i przykładów nieprzenośnego kodu.
Piszę o tym tutaj, żeby potem to gdzieś nie zaginęło, bo warto z tym rozprawić się już na początku, niż żeby kiedyś potem wyszło to jeszcze raz.
Są to głównie rzeczy na których wykrzacza się GCC, ale też kilka rzeczy, które ogólnie rzuciły mi się w oczy.
#0 Brakujące #include'y, wielkość liter w nazwach plików - tym już się zająłem.
#1 Klasy dziedziczące po CAuto mają podwójnie wywoływane konstruktory. Przykład:
Kod: |
CAutoBase::CAutoBase(CInstanceManager* iMan, CObject* object)
: CAuto(iMan, object)
{
CAuto::CAuto(iMan, object);
|
Nie wiem, czy to celowe działanie, czy błąd.
#2 Klasy pochodne mają w destruktorze jawnie wywoływany destruktor klasy bazowej (być może też powoduje to podwójne wywołanie jak konstruktorów).
Kod: |
CAutoBase::~CAutoBase()
{
CAuto::~CAuto();
}
|
Na tym w ogóle wywala się GCC, bo nie pozwala na taką składnię. Trzeba by wszystkie destruktory zamienić na wirtualne i pozbyć się tego.
#3 W robotmain.cpp: #include "classfile.cpp" Hmmm...
#4 Są dwa moduły z funkcją WinMain(): d3dapp.cpp i winmain.cpp. Chyba tylko ten pierwszy jest linkowany? Do czego jest ten drugi?
#5 Copie de taskgoto.cpp, restext-old.cpp - zgaduję, że można się tego pozbyć?
#6 object.cpp, kilka innych miejsc - niestandardowe użycie struktur DirectX np. operator * na najzwyklejszej strukturze D3DMATRIX. Nie ma tego w nagłówkach libwine, MSDN o nich też nic nie wspomina, nie mam pojęcia skąd to wytrzasnęli.
#7 math3d.h i math3d.cpp - funkcje są typu extern inline - nie ma czegoś takiego w standardzie C++ (chociaż jest w niektórych odmianach C). Na tym wywala błąd linker GCC.
#8 sound.cpp funkcja GetCurrentDir() i prawdopodobnie inne miejsca - bezpośrednie operacje na ścieżkach (parsowanie po backslashach), użycie niestandardowego _prgname - do poprawienia od razu.
Jeszcze pewnie parę mi się przypomni.
Od strony organizacyjnej można by pomyśleć o postawieniu np. Bugzilli czy czegoś podobnego, ewentualnie wykorzystać sam system issues Githuba. |
|
|
|
|
Raptor
Clever Girl
Twoja ulubiona misja: Raptorowanie
Pomógł: 4 razy Wiek: 24 Dołączył: 26 Cze 2010 Posty: 432 Skąd: Isla Nublar
|
Wysłany: 19-03-2012, 20:06
|
|
|
Co do bugów, rzeczywiście. Mogę dodać co najwyżej jeszcze jeden, bardzo niepokojący:
#9 Po kompilacji i uruchomieniu gra działa na gołe oko sprawnie, jednak każda próba zapisania stanu gry (np. w swobodnej) kończy się kompletnym crash'em całej gry. Niedobrze...
Widocznie modyfikacje, mające na celu zbudowanie CeeBot'ów na podstawie CoLoBoT'a spowodowały, że obecny kod jest bardzo niespójny. Bardzo niedobrze... |
_________________ - Stężenie czekolady we krwi: 93‰
- Ja to bym zjadł jeszcze batona...
|
|
|
|
|
krzys_h
Twoja ulubiona misja: Wszystkie :)
Pomógł: 3 razy Wiek: 20 Dołączył: 12 Gru 2010 Posty: 255 Skąd: Łódź
|
Wysłany: 19-03-2012, 20:26
|
|
|
piotrdz napisał/a: | #1 Klasy dziedziczące po CAuto mają podwójnie wywoływane konstruktory. |
Myślałem, że to celowe działanie, ale słabo znam się na dziedziczeniu klas, więc mogę się mylić.
piotrdz napisał/a: | #2 Klasy pochodne mają w destruktorze jawnie wywoływany destruktor klasy bazowej |
Patrz wyżej.
piotrdz napisał/a: | #3 W robotmain.cpp: #include "classfile.cpp" Hmmm... |
Natknąłem się na to dzisiaj, sprawdzając czy kod z GitHuba się kompiluje. Może nie chcieli z jakiegoś powodu trzymać tego w jednym pliku. Powinni na to dać jakąś oddzielną klasę z plikiem classfile.h, a nie bezpośrednio includować. Do poprawki.
piotrdz napisał/a: | #4 Są dwa moduły z funkcją WinMain(): d3dapp.cpp i winmain.cpp. Chyba tylko ten pierwszy jest linkowany? Do czego jest ten drugi? |
Tego nie widziałem. Sprawdziłem i "winmain.cpp" nie jest linkowany (za to "winmain.rc" jest), jego rolę pewnie przejął "d3dapp.cpp" a tego zapomnieli usunąć.
piotrdz napisał/a: | #5 Copie de taskgoto.cpp, restext-old.cpp - zgaduję, że można się tego pozbyć? |
Zgadłeś.
piotrdz napisał/a: | #6 - #8 |
Nie znam się na tym, więc nie odpowiem.
Raptor napisał/a: | #9 Po kompilacji i uruchomieniu gra działa na gołe oko sprawnie, jednak każda próba zapisania stanu gry (np. w swobodnej) kończy się kompletnym crash'em całej gry. Niedobrze... |
Sam to zauważyłem i zapomniałem o tym napisać. Pokombinuję nad tym.
piotrdz napisał/a: | Od strony organizacyjnej można by pomyśleć o postawieniu np. Bugzilli czy czegoś podobnego, ewentualnie wykorzystać sam system issues Githuba. |
Ja jestem za issues, ale róbcie jak chcecie.
PS. Przekopiować błędy z tego tematu do issues? (oczywiście po przetłumaczeniu na angielski)
[ Dodano: 19-03-2012, 20:53 ]
Ten zapis crashuje się gdzieś w "float CMainMap::RetZoomMap()", tyle udało mi się znaleść. |
_________________ Gość, cieszysz się, że skontaktowaliśmy się z EPSITEC? |
|
|
|
|
piotrdz
Twoja ulubiona misja: programowanie ;)
Pomógł: 1 raz Dołączył: 17 Mar 2012 Posty: 55 Skąd: Częstochowa
|
Wysłany: 19-03-2012, 22:21
|
|
|
krzys_h napisał/a: |
PS. Przekopiować błędy z tego tematu do issues? (oczywiście po przetłumaczeniu na angielski)
|
Na razie możemy używać tych issues. Tylko z czasem nam się rozrośnie ta lista i może stać to się niewygodnie - dlatego proponowałem bugzillę.
A, jeszcze jeden błąd znalazłem:
#10 W CBotDll.h i CBotVar.cpp. Konstruktor kopiujący:
Kod: | CBotTypResult::CBotTypResult(CBotTypResult& typ) |
zamienić na:
Kod: | CBotTypResult::CBotTypResult(const CBotTypResult& typ) |
Na tym się też wykrzaczył GCC. Być może więcej tego typu błędów się znajdzie.
//Coś ci to cytowanie nie wyszło Poprawiłem. - krzys_h |
Ostatnio zmieniony przez krzys_h 19-03-2012, 22:29, w całości zmieniany 1 raz |
|
|
|
|
krzys_h
Twoja ulubiona misja: Wszystkie :)
Pomógł: 3 razy Wiek: 20 Dołączył: 12 Gru 2010 Posty: 255 Skąd: Łódź
|
|
|
|
|
piotrdz
Twoja ulubiona misja: programowanie ;)
Pomógł: 1 raz Dołączył: 17 Mar 2012 Posty: 55 Skąd: Częstochowa
|
Wysłany: 20-03-2012, 15:50
|
|
|
Hmm, opisy trzeba poprawić, bo nie brzmią dobrze po angielsku. |
|
|
|
|
krzys_h
Twoja ulubiona misja: Wszystkie :)
Pomógł: 3 razy Wiek: 20 Dołączył: 12 Gru 2010 Posty: 255 Skąd: Łódź
|
Wysłany: 20-03-2012, 16:00
|
|
|
Wiem. Nie jestem najlepszy z angielskiego |
_________________ Gość, cieszysz się, że skontaktowaliśmy się z EPSITEC? |
|
|
|
|
piotrdz
Twoja ulubiona misja: programowanie ;)
Pomógł: 1 raz Dołączył: 17 Mar 2012 Posty: 55 Skąd: Częstochowa
|
Wysłany: 20-03-2012, 16:20
|
|
|
krzys_h napisał/a: | Wiem. Nie jestem najlepszy z angielskiego |
To dodajcie mnie do projektu na githubie (mój login to też piotrdz), to poprawię to. |
|
|
|
|
Malcolm
Wiek: 36 Dołączył: 11 Mar 2012 Posty: 3 Skąd: Poland
|
Wysłany: 22-03-2012, 12:22 Re: Bugi, nieprzenośny kod, dziwne rzeczy w kodzie
|
|
|
piotrdz:
ad. 0
Na starszych msvc nie było różnicy, ponieważ na windows i tak nie możesz mieć plików o tej samej nazwie ale różniących się wielkością liter.
ad. 1 oraz 2
Długo się zastanawiałem co autorzy mieli na myśli pisząc to, ale za każdym razem dochodzę do tego samego wniosku.
Brak dostatecznej znajomości c++
Tak jak pisałeś, w klasie bazowej destruktor nie jest virtualny a powinien być, bo inaczej nie zostanie wywołany.
Wygląda mi na to, że gościom po prostu się nie odpalał to dopisali ręcznie (lol),
powiem więcej, wygląda na to, że z rozpędu dodali także ręczne odpalanie konstruktorów.
Ogólnie taki kod aż prosi się o to żeby nie działać.
Ręczne odpalanie konstruktorów stanowczo trzeba wywalić i dodać virtualny destruktor w klasie bazowej.
P.S. Nie zmieniaj wszystkich destruktorów na virtualne!
Trzeba dodać virtualne destruktory wszędzie tam, gdzie są używane virtualne metody. Znając życie to po takich zmianach i przy takiej wielkości projektu pewnie ujawnią się jakieś bugi.
ad. 3
WTF?
ad. 4
Wygląda na to, że pierwszą wersją było winmain.cpp, po zmianach zapomnieli wywalić.
ad. 5
Wywal
ad. 6
W którym miejscu masz tam operator? Tego nie rozumiem, chodzi ci o wskaźniki na strukturę?
ad. 7
Racja, ktoś się uczył C i zabrał się za C++
Z drugiej strony mają dodane to http://msdn.microsoft.com...1(v=vs.85).aspx aby pozbyć się błędów kompilacji. Makabra.
ad. 8
Mistrz. Kolejny dowód na brak doświadczenia i znajomości api.
ad. 9
Debugger i jazda |
|
|
|
|
krzys_h
Twoja ulubiona misja: Wszystkie :)
Pomógł: 3 razy Wiek: 20 Dołączył: 12 Gru 2010 Posty: 255 Skąd: Łódź
|
Wysłany: 22-03-2012, 12:37 Re: Bugi, nieprzenośny kod, dziwne rzeczy w kodzie
|
|
|
Jakby ktoś nie zauważył to niepotrzebnych plików już się pozbyłem. |
_________________ Gość, cieszysz się, że skontaktowaliśmy się z EPSITEC? |
|
|
|
|
piotrdz
Twoja ulubiona misja: programowanie ;)
Pomógł: 1 raz Dołączył: 17 Mar 2012 Posty: 55 Skąd: Częstochowa
|
Wysłany: 22-03-2012, 14:19 Re: Bugi, nieprzenośny kod, dziwne rzeczy w kodzie
|
|
|
Malcolm napisał/a: |
ad. 6
W którym miejscu masz tam operator? Tego nie rozumiem, chodzi ci o wskaźniki na strukturę?
|
object.cpp i funkcja CObject::UpdateTransformObject() masz mnożenie D3DMATRIX za pomocą operatora *. Co ciekawe, mają do tego specjalnie napisaną funkcję w d3dmath.h/cpp: D3DMath_MatrixMultiply().
PS. @Adiblol, co z tym dostępem do repo?
Edit: OK, dzięki Adiblol. Poprawiłem opisy. Jak będę miał więcej czasu, to zajmę się już niektórymi poprawkami. |
|
|
|
|
lukas_j
Geek 127.0.0.1<-hack
Twoja ulubiona misja: nie wiem, lubie wiekszosc :)
Pomógł: 1 raz Dołączył: 07 Cze 2008 Posty: 187 Skąd: localhost
|
Wysłany: 24-03-2012, 21:29
|
|
|
Coś czuje ze będziemy musieli się nieźle namęczyć z tym kodem zeby skompilować to pod gcc... |
_________________ Jestem zwolennikiem wolnego oprogramowania! |
|
|
|
|
piotrdz
Twoja ulubiona misja: programowanie ;)
Pomógł: 1 raz Dołączył: 17 Mar 2012 Posty: 55 Skąd: Częstochowa
|
Wysłany: 25-03-2012, 14:50
|
|
|
lukas_j napisał/a: | Coś czuje ze będziemy musieli się nieźle namęczyć z tym kodem zeby skompilować to pod gcc... |
No właśnie po moich poprawkach skompiluje się.
Już wstawiłem część poprawek. Programerusie tłumaczy pliki alfabetycznie, więc na razie jest poprawione od autobase.cpp do list.h. Na razie czekam, aż skończy z pozostałymi plikami, to też wrzucę poprawki.
Po tym wszystkim, napiszę CMakeLists.txt i sprawdzę kompilację pod mingw i powinno wszystko grać |
|
|
|
|
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
|
|
|
|
piotrdz
Twoja ulubiona misja: programowanie ;)
Pomógł: 1 raz Dołączył: 17 Mar 2012 Posty: 55 Skąd: Częstochowa
|
Wysłany: 26-03-2012, 14:20
|
|
|
Jak pisałem wcześniej, z libwine są problemy. Na razie jako pierwszy cel proponuję właśnie udaną kompilację pod windowsem z cmake i mingw. |
|
|
|
|
|
Nie możesz pisać nowych tematów Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Wersja do druku
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|