Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 Polski Portal COLOBOTa - COLOBOT Polish Portal
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
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ź
Wysłany: 20-03-2012, 13:14   

Skończone:
https://github.com/adiblol/colobot/issues
Kolejne błędy proszę zgłaszać w issues.
_________________
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, 15:50   

krzys_h napisał/a:
Skończone:
https://github.com/adiblol/colobot/issues
Kolejne błędy proszę zgłaszać w issues.

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++ :D
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
Wysłany: 25-03-2012, 15:59   

piotrdz napisał/a:
powinno wszystko grać :)
a libwine?
_________________
1Tbps Project && Telecomix Network

 
 
     
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.
 
 
     
Wyświetl posty z ostatnich:   
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012