Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Program przestaje działać

Ostatnio zmodyfikowano 2025-06-04 00:30
Autor Wiadomość
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 :

C/C++
++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 ) // <-- TUTAJ COS NIE TAK
{
    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.
P-76716
DejaVu
» 2013-02-22 18:35:25
Wyjście poza zakres tablicy:
C/C++
Elementy_ciagu[ liczba_elementow - i ];
P-76720
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)
P-76741
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!
P-182475
« 1 »
  Strona 1 z 1