Wątek przeniesiony 2021-02-04 00:35 z Nietuzinkowe tematy przez somekind.

Coś robiło crash mojego programu

1

Witajcie. Nie wiem czy jest to dobry dział na taki temat ale w dziale C++ raczej by to nie pasowało. Niestety strasznie mnie wku#@! ten crash, tym bardziej, że nie miałem pojęcia co go powoduje, a kod zdawał się być ok.
Chciałbym wam opisać moją historię z pewną sytuacją, która powodowała crash mojej gry. Od dawna w ramach hobby piszę sobie małą grę w C++, a co do programowania to cały czas uważam się za nooba. Dobra.
Całe zamieszanie robił jeden pliczek graficzny, był to sprite pewnej kratki podłogowej: floor1.jpg

W moim wbudowanym w grę edytorze map wygląda to tak:
https://imgur.com/PfDP1Ze

Klikając LPM wybieramy sprite i możemy budować naszą mapę. o to screen z edytora:
https://imgur.com/LxptQgf

Za każdym razem jak wybierałem w edytorze sprite tej kratki podłogowej o nazwie floor1.jpg to gra crashowała. Próbowałem chyba wszystkiego, zmieniałem nazwę pliku, zmieniałem format na inny niz jpg. Nawet wyszukiwałem w kodzie źródłowym czy nie stworzyłem jakiegoś obiektu bądź nie przypisałem jakiemuś stringowi nazwy "floor1". I nic.
Później nawet doszedłem do wniosku, że nie będę już używał tego sprita na mojej mapie... no ale co będzie jak ten crash zacznie się pojawiać przy innych plikach graficznych? Postanowiłem jeszcze przeszukać folder projektu czy może nie ma jakiś zduplikowanych plików o nazwie floor1 i... nie było ale nagle dostałem olśnienia.

Zobaczcie screena:
https://imgur.com/Ir9O0jj

Zdziwił mnie rozmiar, 49x50, kiedy to wszystkie moje sprity mają 50x50 albo 100x50. Być może musiałem niedawno modyfikować tą kratkę podłogową i nie chcący w GIMP'ie zmieniłem rozmiar o 1px... Przypomniałem sobie jak kiedyś robiłem mapy do HL1 i tam wszystkie tekstury musiały być podzielne przez 2, 4, 8, 16, 32, 16, 64, 128, 256 itp. Włączyłem gimpa i zmieniłem rozmiar na 50x50 i wszystko już działa. Mój głupi błąd przez, który chciałem porzucić mój mały projekt. Na początku posta napisalem, że zdawało mi się, że kod był OK ale nie był bo moja klasa sprite manager powinna wyłapać przy wczytywaniu zasobów czy plik graficzny ma odpowiednie rozmiary.

Koniec monologu. Miłego dnia.

1

C++ jest polem minowym, należy obstawiać, ze twój kod ma błędy, które są uśpione aż do jakiejś zbieżności danych (tzw UB undefined behaviour)
Gdy taka przyjdzie błąd się ujawnia.
(Dlatego C/C++ moim zdaniem jest ZŁYM językiem do nauki, nie ma natychmiastowej "kary" za błędy - adepci długo tkwią w poczuciu bezbłędności).

Bez kodu nikt tu merytoeycznie się nie wypowie.

3

Za każdym razem jak wybierałem w edytorze sprite tej kratki podłogowej o nazwie floor1.jpg to gra crashowała. Próbowałem chyba wszystkiego, zmieniałem nazwę pliku, zmieniałem format na inny niz jpg. Nawet wyszukiwałem w kodzie źródłowym czy nie stworzyłem jakiegoś obiektu bądź nie przypisałem jakiemuś stringowi nazwy "floor1". I nic.

A przyszło ci do głowy użyć debugera? o_o Wiesz, stawiasz breakpoint na tej funkcji ładującej sprita a potem lecisz step-by-step przez kod aż trafisz na błąd. Zajęłoby to pewnie 10 minut. Polecam programować z głową a nie permutation driven development.

1

Hehe, kiedyś pisałem bombermana i namieszałem w obsłudze pamięci. Miałem niezłego wtfa gdy odkryłem, że usunięcie z klasy nieużywanej tablicy powoduje pojawianie się błędu. Albo tekstury mi się dziwnie "kolorowały", bo coś namieszałem ze wskaźnikami/pamięcią. Ale ostatecznie wszystko zadziałało i nawet da się grać. Kurła, to były czasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1