• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

626 Obżartuchy - Segmentation fault

VPS Starter Arubacloud
+1 głos
201 wizyt
pytanie zadane 18 czerwca 2018 w SPOJ przez Fernokip Nowicjusz (180 p.)
otagowane ponownie 19 czerwca 2018 przez Fernokip

Czy ktoś mógłby zasugerować co robię źle w tym zadaniu? Po kilku próbach, w tym usunięciu biblioteki <math.h>, która była potrzebna do użycia ceil i floor ( kod też trochę zmieniłem), sędzia mówi mi, że źle wykonuję zadanie, w sensie - Błąd wykonania (SIGSEGV). Nie rozumiem o co chodzi z tym naruszeniem ochrony pamięci (segmentation fault). Oto mój kod:

#include <iostream>

using namespace std;
int doba = 86400;
int t[100];     //czas zjedzenia ciastka
int n,m;    //n-ile obzartuchow, m-ile ciastek w pudelku
double sr[100]; //ile ciastek zje obzartuch w ciagu doby
int ile;    //suma-najpierw ciastek, a potem pudelek
int r;      //ile razy ma sie wykonac test


int main()
{
	cin>>r;
    for(int i=0;i<r;i++)
    {
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {cin>>t[i];

    sr[i]=(doba/t[i]);
    }
    ile=0;
        for(int i=0;i<n;i++)
        {
           ile+=sr[i];
        }

    if(ile%m==0) ile=ile/m;
    else ile=(ile/m)+1;

cout<<ile<<endl;
}
    return 0;
}

 

komentarz 18 czerwca 2018 przez Mariusz08 Maniak (62,280 p.)
Zła kategoria
komentarz 18 czerwca 2018 przez Fernokip Nowicjusz (180 p.)
edycja 18 czerwca 2018 przez Fernokip
Przepraszam, pierwszy raz korzystam z jakiegokolwiek forum.

1 odpowiedź

+2 głosów
odpowiedź 18 czerwca 2018 przez Michał Muzyka Pasjonat (24,080 p.)
wybrane 18 czerwca 2018 przez Fernokip
 
Najlepsza
cin>>r;
for(int i=0;i<r;i++) //iterator i
{
    cin>>n>>m;
    for(int i=0;i<n;i++) //iterator i, występuje konflikt z tym wyżej
    {
        cin>>t[i];
        sr[i]=(doba/t[i]);
    }
    ile=0;
    for(int i=0;i<n;i++) //iterator i, występuje konflikt z pierwszą pętlą
    {
        ile+=sr[i];
    }
    if(ile%m==0) ile=ile/m;
    else ile=(ile/m)+1;
 
    cout<<ile<<endl;
}

uporządkujmy najpierw kod,

nie możesz używać tej samej zmiennej w zagnieżdżonej pętli, ponieważ zmieniasz wartość tej pierwszej co może oznaczać że wychodzisz poza zakres:

zmień nazwę zmiennej w pierwszej pętli np. na k

komentarz 18 czerwca 2018 przez Fernokip Nowicjusz (180 p.)

Zmieniłem nazwy iteratorów, ale nadal pojawia się ten sam problem :/

#include <iostream>

using namespace std;
int doba = 86400;
int t[100];     //czas zjedzenia ciastka
int n,m;    //n-ile obzartuchow, m-ile ciastek w pudelku
double sr[100]; //ile ciastek zje w ciagu doby
int ile;    //suma
int r;      //ile razy ma sie wykonac test


int main()
{
	cin>>r;
    for(int k=0;k<r;k++)     //zmienilem iterator na k, tak jak powiedziales 
    {
    cin>>n>>m;
    for(int i=0;i<n;i++)     //tutaj zostawilem i
    {cin>>t[i];

    sr[i]=(doba/t[i]);
    }
    ile=0;
        for(int j=0;j<n;j++)    //tutaj zmienilem iterator na j
        {
           ile+=sr[j];
        }

    if(ile%m==0) ile=ile/m;
    else ile=(ile/m)+1;

cout<<ile<<endl;
}
    return 0;
}

 

1
komentarz 19 czerwca 2018 przez RafalS VIP (122,820 p.)
Nie chce mi się tego robić, ale dodaj sobie proste ify w każdym miejscu gdzie używasz tablica[indeks] sprawdzające czy indeks nie jest większy niż rozmiar tablicy, bo taki błąd sugeruje właśnie wyjście poza zakres tablicy.
1
komentarz 19 czerwca 2018 przez RafalS VIP (122,820 p.)

Rzuciłem okiem na zadanie:

(1 ≤ N ≤ 10.000, 1 ≤ M ≤ 1.000.000.000).

 

int t[100];     //czas zjedzenia ciastka
....
for(int i=0;i<n;i++)     //tutaj zostawilem i
{cin>>t[i];

Oczywisty błąd, tablica t ma pomieścić 10 000 czasów a jej pojemnośc to 100.

Podobne pytania

0 głosów
1 odpowiedź 312 wizyt
pytanie zadane 4 listopada 2017 w SPOJ przez PanJaqb Początkujący (360 p.)
0 głosów
1 odpowiedź 459 wizyt
–1 głos
1 odpowiedź 637 wizyt
pytanie zadane 13 lipca 2018 w SPOJ przez Bloom55 Użytkownik (660 p.)

92,972 zapytań

141,936 odpowiedzi

321,171 komentarzy

62,301 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...