Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Allegro - Nie potrafię sobie poradzić z błędem

przemko07 03 Wrz 2012 01:31 1560 10
  • #1 03 Wrz 2012 01:31
    przemko07
    Poziom 16  

    Zamieszczam cały kod, chociaż problem jest na 99% w liście-klasie

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    To jest allegro 4.4, wiem że biblioteka powinna zostać zapomniana ale tylko sprawdzam koncepcje przed pisaniem. Program ma za zadanie tworzyć obiekty na ekranie które mają początkową prędkość oraz na które będzie działać grawitacja oraz tarcie. Problem z programem pojawia się tylko wtedy gdy jest dużo obiektów na ekranie, a raczej kiedy się usuwają albo jeszcze coś innego. Program wywala mnie do Windowsa z błędem
    Code:
    Wystąpił problem z aplikacją fajerwerki.exe i zostanie ona zamknięta. Przepraszamy za kłopoty.
    Błąd nie wyskakuję wtedy gdy przekroczę dużą liczę obiektów, albo podczas któregoś z typów usuwania jakichś obiektów. Nie mam pojęcia gdzie leży błąd. Bo za każdym razem w innej linijce. Program się sypie tylko przy dużych ilościach obiektów(kilka tysięcy wystarczy). Proszę o pomoc, sam nie poradzę sobie z tym problemem.

    EDIT:
    Wiem że kursor nie jest zabezpieczony przed wyjechaniem poza obszar bufora, ale bez tego program się sypie.

    Nie wiem dlaczego, ale programu nie da się wysypać, jeśli cały czas się trzyma LPM.

    Kolejną dziwną rzecz zauważyłem, program psuje się tylko wtedy gdy przekroczę jakąś ilość elementów, jak jest mniej od 2k to wszystko ok, jak więcej to już nie za bardzo. (ENTER tworzy 1k elementów w miejscu myszki)

    0 10
  • #2 03 Wrz 2012 20:29
    lolcio
    Poziom 16  

    A kolega zna pojęcie debuger? :) Stawiamy breakpointa i przechodzimy po kolei miedzy poszczególnymi poleceniami szukając przyczyny błedu.

    Zawartość maina możesz otoczyć blokiem try-catch, może jakiś wyjątek tam się złapie.

    W jakim IDE piszesz? Na windowsie?

    0
  • #3 03 Wrz 2012 21:29
    przemko07
    Poziom 16  

    Tak na windowsie,
    program może działać tyle ile chce, mogę mieć nawet 50k elementów, które będą się poruszać itd, mogę w ciąż dodawać nowe elementy i dość do większej liczby. Jednak kiedy ilość elementów zacznie spadać i dojdzie np do 300 to program się sypie, czasami przy 300 czasami przy 3000. Sprawdzałem w którym miejscu błąd wywala, niestety za każdym razem gdzie indziej.
    (Sprawdzałem w taki sposób że zmienna volatile w programie głównym zmienia wartości linijek w kodzie, a drugi program(inny) odczytuje wartość zmiennej.)

    EDIT:
    dodaje załącznik, obawiam się tylko że Win7 nie otworzy tego.

    0
  • #4 14 Wrz 2012 20:52
    przemko07
    Poziom 16  

    Na allegro 5.0.6 także występuje ten błąd.
    Zamieszczam kod, ale nie wydaje mi się aby to była jego wina. Coś czuje że PC nie może sobie poradzić z tak dużą ilością pamięci która jest alokowana i usuwana w tak krótkim czasie.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Jakby ktoś miał doświadczenie w takich problemach, to prosiłbym o udzielenie się.
    W ostateczności zrezygnuje z listy i zrobię tablice 2k elementów i będzie spokój.

    0
  • #5 18 Wrz 2012 12:56
    Akane
    Poziom 27  

    Problem leży w niewłaściwym usuwaniu elementów z takiej listy. Jest wiele możliwości, oto trzy proste:
    1. Dodaj atrybut "bool ignoruj" do struktury listy, ustaw go domyślnie na false, pomijaj wszelkie akcje na elemencie w metodach przesun() oraz maluj() jeżeli atrubut jest true, a zamiast usuwać, ustaw ten nowy atrybut na true. Potem tylko za jednym zamachem skasuj wszystkie elementy listy.

    2. Napraw algorytm usuwania elementu z listy. Rozrysuj sobie szerogowo trzy kwadraty, połączone ze sobą wektorami "następny" oraz "poprzedni". Przeanalizuj jak usunąć środkowy element, który jest wskazywany przez zmienną "pomoc".
    Następnie zasymuluj brak lewego i prawego (czyli poprzedniego i następnego) elementu. Porównaj także usunięty element ze wskaźnikiem "głowa". Jak myślisz, po usunięciu elementu głowa - co powinno się stać ze zmienną c_lista::glowa? (dwie możliwości).
    Całkiem podobny problem wystąpi u ślepego dekarza - zabierasz mu sprzed stóp kawałek dachu nie informując go o tym. Co się stanie, gdy dekarz ruszy przed siebie? Crash, wyjątek.

    3. Oblicz/zasugeruj ile najwięcej aktywnych elementów wystąpi w liście, byle nie było ich tyle, że całe okno zapełni się białym kolorem. Użyj wyniku do utworzenia tablicy s_lista[] o stałym rozmiarze i usuń listę. Szkoda marnować mocy obliczeniowej na listę. Usuwanie elementów z tablicy wymaga jedynie przeniesienia ostatniego aktywnego elementu na pozycję kasowaną, i od razu mamy tablicę podzieloną na liniowy ciąg aktywnych i wolnych elementów.

    0
  • #6 18 Wrz 2012 21:15
    przemko07
    Poziom 16  

    Dzięki za pomoc, jednak zrobię dużą tablice. W kodzie który napisałem nie ma błędu(w sumie jesteś drugą osobą która nie spojrzała na niego i napisała wiadomość), ale coś mi się wydaje że system po prostu nie radzi sobie z tak dużą ilością przetwarzanych danych, bo u mnie było około 2k elementów na sekundę które są usuwane i tworzone. Ten pomysł z zmienną bool jest całkiem fajny, no ale wydłuża proces usuwania elementu o kilka operacji. Tablica będzie idealnym wyjściem z tego problemu, tematu nie zamykam bo chciałbym poczekać aby ktoś potwierdził moją teorie. O tym że system nie potrafi dużej ilości danych tworzyć i usuwać.

    0
  • #7 19 Wrz 2012 13:28
    Akane
    Poziom 27  

    Mylisz się. Skompilowałem go sobie, dodałem brakującą grafikę i uruchomiłem. Stało się to co opisałeś. Usunąłem więc Twoją implementację listy i wstawiłem gotowca, co natychmiast dało pozytywny efekt.

    A tak nawiasem: zmień format plików z bitmap na jpg (tło) oraz png/gif (szczegółowe detale). Allegro radzi sobie z doskonale, o ile sobie wkompilowałeś ich obsługę.

    0
  • #8 19 Wrz 2012 13:44
    gaskoin
    Poziom 38  

    przemko07 napisał:
    Tablica będzie idealnym wyjściem z tego problemu, tematu nie zamykam bo chciałbym poczekać aby ktoś potwierdził moją teorie. O tym że system nie potrafi dużej ilości danych tworzyć i usuwać.


    Ja potwierdzę, że jesteś w błędzie. Kolega wyżej ma rację. Twoja implementacja listy jest bardzo nieczytelna. Bardzo łatwo tam o pomyłkę, a jeszcze trudniej ją znaleźć. System nie ma najmniejszych problemów z przetwarzaniem takich danych i zapewniam, że może przetwarzać ich znacznie więcej.

    0
  • #9 19 Wrz 2012 15:39
    przemko07
    Poziom 16  

    Mieliście racje błąd leżał w usuwaniu elementów, zamieszczam poprawny kod wraz z komentarzami

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Dokładnie to usuwałem sobie element zanim przeprowadziłem na nim operacje. Nie mam pojęcia czy czasami wciąż nie ma na liście błędów bo nie mogę tego sprawdzić tak jak poprzednio(nie mam dostępu do 100% komputera). Sprawdzałem kilkukrotnie kod zanim zamieściłem na forum, teraz tylko lekcja dla mnie. Aby sprawdzać do skutku :)

    0
  • #11 19 Wrz 2012 21:58
    przemko07
    Poziom 16  

    Cytat:
    Polecam testy jednostkowe

    Tzn ?
    Ja w ten sposób testowałem tą listę, że rysowałem sobie na kartce. 5 razy wyszło że wszystko mam dobrze, a błąd był w tym, że zatrzymywałem się podczas ostatniej operacji, czyli 3 warunku pętli for który był schowany na samej górze kodu :)
    To był powód powstania tego całego tematu.

    0
  Szukaj w 5mln produktów