[C++] Olimpiada Informatyczna - Naruszenie ochrony pamięci (SIGSEGV)

0

Po wysłaniu kodu programu na serwer Olimpiady Informatycznej przy jednym teście system wyrzucił mi komunikat: "process exited due to signal 11 Naruszenie ochrony pamięci (SIGSEGV)". Czy ktoś może (z doświadczenia) wie, o co chodzi? Bo na domowym kompie nie ma żadnych błędów... Nie wydaje mi się, aby program przekroczył dostępną pamięć, bo limit to 64MB, a mój wykorzystuje tylko niecałe 5. W programie wykorzystuję wektory jako zamiennik tablic, do pobierania i wyrzucania danych cin i cout... nie wiem, jakie jeszcze informacje mogą Wam się przydać... bo kodu dać nie mogę, ze względu na regulamin OI...

0

Po prostu, twój program naruszył strukturę stery. Najprawdopodobniej wyszedłeś poza zakres tablicy, względnie posłużyłeś się nieustawiony wskaźnikiem.
Pytanie jak testowałeś swój kod. Jeśli jedynie przykładem dostarczonym do zadania, to jest to zdecydowanie ZA MAŁO.
Do testowania algorytmu powinieneś stworzyć też swoje dane testowe, tak by pokryć jak najszerszy zakres przypadków szczególnych.

0

Wszystko rozumiem. Tylko jak mogłem wyjść za rozmiar tablicy, skoro używam wektorów?

0

segfault oznacza z reguły że piszesz/czytasz po pamięci która nie jest twoja. Jesteś pewien że zakresy tablic są w porządku?
A jak odnosisz się do wektora? Za pomocą operatora[] czy też push/pop? Bo jeśli za pomocą [] to jak najbardziej możesz wyjść poza zakres, bo indeksując [] nie dodają sie automatycznie rekordy.

0

Owszem, poprzez operator[], jednak w takiej pętli:

for(unsigned i=0; i < dane.size(); ++i) {

      dane[i]=???;

}
0

Więc jak to poprawić... nie chciałbym popędzać, bo to i tak nic nie da, ale czas mi się kończy...

0

Witaj Luke, z forumweb ;p.

Nie wiem, czy dobrze rozumiem problem, ale możliwe, że odwołujesz się do elementu wektora, który jeszcze nie istnieje. Musisz powiększyć rozmiar wektora (metoda resize()) lub dodać na sam koniec jakiś element(metoda push_back(T & element)).

0
Luke24 napisał(a)

Owszem, poprzez operator[], jednak w takiej pętli:

for(unsigned i=0; i < dane.size(); ++i) {

      dane[i]=???;

}

Już dałem kod, jakiego używam. Jak widać, nie jest tu możliwe przekroczenie rozmiaru wektora. Również Cię witam jackwebie z forumweb.pl :P Ktoś mi nazwę nicka podkosił... ;/

0

Ja założyłem, że deklarujesz vector tak:
std::vector<int> dane; I po tym nic. Wtedy wektor ma rozmiar 0 i nie możesz sie odwoływać do żadnego elementu. Rozszerzyłeś ten wektor (resize)? Ewentualnie możesz zrobić

for(unsigned i=0; i < dane.size(); ++i) {
      dane.push_back(???);
}
0

Oczywiście, że go rozszerzyłem, bo inaczej, to miałby wielkość zero i pętla w ogóle by się nie wykonała...

0
Luke24 napisał(a)

Więc jak to poprawić... nie chciałbym popędzać, bo to i tak nic nie da, ale czas mi się kończy...

przecież sam stwierdziłeś, że tutaj nie ma co poprawiać o.0 i masz rację

pokaż więcej kodu bo jak na razie z fusów nie wróżymy

0

Kurde, taki błąd... Owszem, wychodziłem za zakres tablicy, bo nie było warunku na k.

           for(unsigned k=i; ; ++k) {
                int temp = 0;
                temp=temp+dane[k];
                if(temp<ile) {
                    odpusc_se=temp;
                }
                else {
                    goto dajemy;
                }
           }

Teraz mam jeszcze problem z przekroczeniem czasu, ale w tym już nie możecie mi pomóc. ;/

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