tomo6916 Temat założony przez niniejszego użytkownika  | 
[C++] Vector subscript out of range » 2016-12-02 17:15:23 Dzień dobry. Mam problem z moim programem (program oblicza liczbę mandatów uzyskanych przez partie w wyborach metodą D'Hondta); gdy uruchamiam go poprzez plik wykonywalny .exe, to wyskakuje mi komunikat o treści "vector subscript out of range". Kompilator nie wykrywa żadnych błędów. Wiem, że ten komunikat pojawia się, gdy odwołujemy się do nieistniejących elementów/przekraczamy rozmiar wektora. Nie jestem jednak w stanie znaleźć źródła problemu w moim kodzie. int main() {     string wejscie = "wejscie.txt";     string wyjscie = "wyjscie.txt";               ifstream odczyt( wejscie );     int dane;     vector < int > wektor_danych;      int i = 0;     while( odczyt >> dane )     {         wektor_danych.push_back( dane );         i++;     }          const int liczba_partii = wektor_danych.size() - 1;           vector < int > ilorazy_wyborcze;                for( int i = 0; i < liczba_partii; i++ )     {         ilorazy_wyborcze.push_back( wektor_danych[ i + 1 ] );     }          const int liczba_mandatow = wektor_danych[ 0 ];           vector < int > mandaty;                for( int i = 0; i < liczba_partii; i++ )     {         mandaty.push_back( 0 );     }               int max = 0;      int imax = 0;           vector < int > wektor_glosow;                for( int i = 0; i < liczba_partii; i++ )     {         wektor_glosow.push_back( ilorazy_wyborcze[ i ] );     }               for( int i = 0; i < liczba_mandatow; i++ )     {         for( int j = 0; j < liczba_partii; j++ )         {             if( ilorazy_wyborcze[ j ] > max )              {                 max = ilorazy_wyborcze[ j ];                 imax = j;             }             for( int k = 0; k < liczba_partii; k++ )              {                 if( ilorazy_wyborcze[ k ] == max && k != j && wektor_glosow[ k ] > wektor_glosow[ j ] )                 {                     max = ilorazy_wyborcze[ k ];                      imax = k;                 }             }         }         mandaty[ imax ] ++;          ilorazy_wyborcze[ imax ] = ilorazy_wyborcze[ imax ] * mandaty[ imax ] /( mandaty[ imax ] + 1 );          max = 0;      }               ofstream zapis( wyjscie );          zapis << "--------WYNIKI GLOSOWANIA--------\n\nSposrod " << liczba_mandatow << " mandatow, partie uzyskaly nastepujaca liczbe mandatow:\n\n";     for( int i = 0; i < liczba_partii; i++ )     {         zapis << "partia nr " << i + 1 << ":\t" << mandaty[ i ] << endl;     }               return 0; }
   | 
 | 
carlosmay  | 
» 2016-12-02 17:21:46 Im wcześniej zaczniesz korzystać z debuggera, tym lepiej. Tak szuka się błędów w czasie wykonywania programu. edit: co mogę Ci poradzić: Podziel kod na funkcje, bo tego kodu nie da się sprawnie czytać. | program oblicza liczbę mandatów uzyskanych przez partie w wyborach metodą D'Hondta |  
 Opisuj oczekiwane działanie programu. Nie każdemu chce się zagłębiać w wybraną metodę (jestem leniwy).  | 
 | 
Gibas11  | 
» 2016-12-02 19:49:26 @up  | Opisuj oczekiwane działanie programu. Nie każdemu chce się zagłębiać w wybraną metodę (jestem leniwy). |  
 Jakby trzeba było, takie błędy są z reguły oczywiste i powstają w efekcie niedopatrzenia, to tylko wyjście poza zakres vectora. @OP for( int i = 0; i < liczba_partii; i++ ) {     ilorazy_wyborcze.push_back( wektor_danych[ i + 1 ] ); }
  1. wykraczasz poza zakres vectora  wektor_danych . 2. Dane kopiuje się między kontenerami używając std::copy: std::copy( vec1.begin(), vec1.end(), std::back_inserter( vec2 ) );  | 
 | 
tomo6916 Temat założony przez niniejszego użytkownika  | 
» 2016-12-02 20:21:41 Hmmm, nie widzę tego. Wektor  wektor_danych  ma rozmiar o 1 większy niż wartość  liczba_partii . Przykładowo, gdy  liczba_partii  jest równa 3, to  wektor_danych  ma rozmiar 4. Wspomniana pętla for wykona się po raz ostatni dla i=2, a wtedy  wektor_danych[ i + 1 ]  to  wektor_danych[ 3 ] , czyli nie wykraczam poza zakres. A przynajmniej tak mi się wydaje. Czy coś mi tutaj umyka? W każdym razie dziękuję za odpowiedź, spróbuję skopiować dane przy użyciu std::copy.  | 
 | 
Gibas11  | 
» 2016-12-02 20:27:40 No rzeczywiście. ;-; Reszta kodu już taka prosta nie jest, więc też odsyłam do debuggera. A tak btw dlaczego pomijasz w tamtej pętli pierwszy element vectora z 'danymi'? @down Nie do końca chodzi o wartości zmiennych, w moim przypadku program wysypuje się tylko jeśli nie znajdzie pliku, inaczej debugger nie zająknął się ani słowem. A problem jest tu: const int liczba_mandatow = wektor_danych[ 0 ]; Bo nie ma sprawdzania czy vector nie jest pusty. Chyba że nie działa jeszcze coś, u mnie nic więcej nie ma.  | 
 | 
j23  | 
» 2016-12-02 20:29:30 Odpal program pod kontrolą debuggera. Jeśli wyskoczy Ci wyjątek, użyj okna call stack do zlokalizowania miejsca wystrzału w twoim kodzie. Będziesz wiedział, przy jakich wartościach zmiennych dochodzi do wyjątku, a stąd prosta droga do rozwiązania problemu.  | 
 | 
tomo6916 Temat założony przez niniejszego użytkownika  | 
» 2016-12-02 20:32:27 Ponieważ w moim pliku wejściowym  wejscie.txt  zapisane są dane w następujący sposób: pierwszą wartością jest liczba miejsc z parlamencie, a następnie podawane są rozdzielone spacjami liczby głosów uzyskane przez partie. Zapomniałem o tym wspomnieć - mój błąd. @Gibas11 rzeczywiście, błąd jest w tym miejscu. Co dokładnie powinienem zrobić, żeby uniknąć tego błędu?  | 
 | 
Gibas11  | 
» 2016-12-02 22:27:12 Sprawdź czy cokolwiek jest w vectorze z danymi (np.  if( !wektor_danych.size() ) { std::cout << "pusto ;-;\n"; }  i jeśli nie – wyświetl jakiś komunikat o błędzie i zakończ program, bo i tak nie ma co robić.  | 
 | 
|  « 1 »  2 |