[C++] Program przestaje działać
Ostatnio zmodyfikowano 2025-06-04 00:30
Piciupol Temat założony przez niniejszego użytkownika |
[C++] Program przestaje działać » 2013-02-22 17:09:35 Witam. Mam taki problem(uzywam Code Blocks) ze nie ma zadnych bledow kompilatora, a dopiero po uruchomieniu program po prostu przestaje działać. Jest to test podstawowych funkcji mojej gry i polega na tym ze powinien byc tworzony lancuch z kolorowych(tutaj tylko czarnych kul) i kazda kolejna powinna miec pozycje x z tablicy wspolrzedne[27][2][1] w ktorej zapisalem wlasnie pozycje poszczegolnych elementow w miare dolaczania kolejnych. Wydaje mi sie ze problem lezy tutaj : ++liczba_elementow; Elementy_ciagu.push_back( KULA( true, liczba_elementow, wspolrzedne[ 0 ][ 0 ][ 0 ], wspolrzedne[ 0 ][ 1 ][ 0 ], kolor ) ); Ciag_TMP.resize( Elementy_ciagu.size() ); for( unsigned int i = 0; i < Elementy_ciagu.size(); ++i ) { Ciag_TMP[ i ] = Elementy_ciagu[ liczba_elementow - i ]; } for( unsigned int i = 0; i < Elementy_ciagu.size(); ++i ) { Elementy_ciagu[ i ] = Ciag_TMP[ i ]; } for( unsigned int i = 0; i < Elementy_ciagu.size(); ++i ) { Elementy_ciagu[ i ].pozycja_x = wspolrzedne[ liczba_elementow - Elementy_ciagu[ i ].indeks ][ 0 ][ 0 ]; Elementy_ciagu[ i ].pozycja_y = wspolrzedne[ liczba_elementow - Elementy_ciagu[ i ].indeks ][ 1 ][ 0 ]; }
Wektor Elementy_ciagu oraz Ciag_TMP skladaja sie z obiektow "KULA". W zaznaczonej linijce kodu, gdy jest tak jak jest, program odrazu sie zawiesza, gdy zmniejsze .size() o 1 to program wyswietla pierwszy element i sie zawiesza, a gdy w ogole usune cala ta petle z tego miejsca, to program dziala, ale wiadomo wariuje, wyswietla najpierw jeden element na poczatku, pozniej drugi niewiadomo gdzie i dalej nic sie nie dzieje. Naprawde nie wiem w czym problem, mam nadzieje ze moze zauzwazycie cos co ja przegapilem w glupi sposob lub jakis powazniejszy blad. |
|
DejaVu |
» 2013-02-22 18:35:25 Wyjście poza zakres tablicy: Elementy_ciagu[ liczba_elementow - i ];
|
|
RazzorFlame |
» 2013-02-22 20:50:58 Piciupol gdybyś chciał to byś znalazł rozwiązanie. Od czego jest Debugger? Sam byłem GREEN w tej sprawie jeszcze pół roku temu ale teraz jest spoko :P (Dziiwne, czy debugger wskazuje tylko 1 rodzaj błędu - SIGSEGV? Kilkanaście razy już mi to pod rząd wyjednało ;p) |
|
termistor |
» 2025-06-04 00:30:48 Wskazówki do analizy problemu Zauważ, że w pętli: for (unsigned int i = 0; i < Elementy_ciagu.size(); ++i) { Elementy_ciagu[i].pozycja_x = wspolrzedne[liczba_elementow - Elementy_ciagu[i].indeks][0][0]; Elementy_ciagu[i].pozycja_y = wspolrzedne[liczba_elementow - Elementy_ciagu[i].indeks][1][0]; }
...indeks `wspolrzedne[liczba_elementow - Elementy_ciagu .indeks][...]` może wyjść poza zakres tablicy.
### Główny problem Zakładamy, że `wspolrzedne` jest tablicą 3D o wymiarach `[27][2][1]`. Jeśli `liczba_elementow` odpowiada aktualnej liczbie elementów w `Elementy_ciagu`, to wyrażenie `liczba_elementow - Elementy_ciagu.indeks` może przyjmować wartości **większe niż 26** (np. gdy `indeks == 0` i `liczba_elementow == 30`).
### Dlaczego to się kończy awarią? Dostęp do `wspolrzedne[x][...]` dla `x >= 27` wywołuje **undefined behavior** (wbrew deklaracji tablicy), co może powodować: - awarię programu (SIGSEGV), - losowe dane, - niepoprawne przesunięcie w pamięci.
### Propozycje rozwiązania
1. **Sprawdź zakresy indeksów** Zanim wyznaczysz `wspolrzedne[...][...][...]`, dodaj warunek: int idx = liczba_elementow - Elementy_ciagu[i].indeks; if (idx >= 0 && idx < 27) { Elementy_ciagu[i].pozycja_x = wspolrzedne[idx][0][0]; Elementy_ciagu[i].pozycja_y = wspolrzedne[idx][1][0]; } else { // obsłuż błąd lub zaloguj }
2. **Zbadaj źródło `indeks`** Upewnij się, że `indeks` w obiektach `KULA` jest poprawnie ustawiany. Jeśli `indeks` może być ujemny lub przekraczać `liczba_elementow`, to może to prowadzić do `idx < 0`.
3. **Debugowanie** Wyświetl wartości `idx` i `Elementy_ciagu.indeks` w pętli: std::cerr << "idx: " << idx << ", indeks: " << Elementy_ciagu[i].indeks << std::endl;
4. **Zmiana logiki** Jeśli `wspolrzedne` zawiera współrzędne **odwrotnie do kolejności `Elementy_ciagu`**, rozważ: - odwrócenie kolejności w `Elementy_ciagu` wcześniej (np. przez `std::reverse`), - przekazanie odpowiednich indeksów przy tworzeniu obiektów `KULA`.
### Dodatkowe uwagi - Jeśli `wspolrzedne` jest dynamicznie alokowane, upewnij się, że rozmiar jest wystarczający. - Jeśli `Elementy_ciagu` zawiera elementy z `indeks` > `liczba_elementow`, to `idx` staje się ujemny, co również prowadzi do problemu.
Przykład poprawnego dostępu:
int idx = liczba_elementow - Elementy_ciagu[i].indeks - 1; if (idx >= 0 && idx < 27) { ... }
...jeśli `wspolrzedne` jest indeksowane od 0 do 26.
Daj znać, jeśli potrzebujesz pomocy z debugowaniem! |
|
« 1 » |