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

Test - SPOJ - "błąd wykonania (SIGSEGV) "

0 głosów
934 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez Kamil Paradowski Użytkownik (620 p.)

Witam, mam problem. Mój kod wygląda tak: 

#include <iostream>
#include <cstring>

int main()
{
    char a[690000];
    char b[690000];
    char c[690000];
    int d=0;
    std::cin>>a;
    std::cin>>b;
    std::cin>>c;
    for(int i=0;i<strlen(a);i++)
    {
        if ((a[i]==b[i] && a[i]!=c[i]) || (a[i]!=b[i] && a[i]==c[i]))
            d++;
        else if (a[i]!=b[i] && b[i]==c[i])
            d=d+2;
        else if (a[i]!=b[i] && b[i]!=c[i])
            d++;
    }
    std::cout<<d<<std::endl;
    return 0;
}

Treść zadania: http://pl.spoj.com/problems/AL_15_01/

Kiedy wysyłam mój kod na SPOJ'a to wyskakuje mi komunikat: "błąd wykonania (SIGSEGV) "

Czy mógłby ktoś mi wyjaśnić dlaczego wyskakuje mi tego typu błąd, czym jest to spowodowane w tym przypadku. Słyszałem, że jest to związane z jakimiś niedozwolonymi operacjami programistycznymi bądź matematycznymi np. dzielenie przez 0.

1 odpowiedź

+1 głos
odpowiedź 6 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)

Masz zbyt mały rozmiar tablic - jest tam napisane, że max. ilość pytań to 10^6 czyli milion, a ty zrobiłeś miejsce dla 690000 pytań. Zrób z a,b,c dynamicznie zaalokowaną tablicę o rozmiarze milion i przejdzie test. Tylko potem zwolnij to miejsce. Nie alokuj tego automatycznie (czyli na stosie), bo bardzo łatwo możesz wyjść poza jego pojemność - stack overflow. W przypadku zaalokowania 3 milionów bajtów - 3MB jest to bardzo prawdopodobne - zamiast tego zaalokuj to dynamicznie - na stercie.

komentarz 6 sierpnia 2017 przez Kamil Paradowski Użytkownik (620 p.)
Spróbuje to jutro zrobić, choć mam jeszcze problemy ze wskaźnikami i alokowaniem dynamicznie pamięci. Z ciekawości powiększałem i zmniejszałem rozmiar tablicy (np. 1000 a później dawałem nawet powyżej 10^6) i też ten sam błąd. w Code Blocksie zauważyłem, że jak dam jakoś ponad większy rozmiar niż 69500+ to wywalia mi błąd przy kompilacji, to tak w ramach ciekawości piszę.
komentarz 6 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)

Dziwne, że wywala błąd przy kompilacji, może próbuje myśleć za Ciebie i Ci mówi, że przekroczysz pojemność stosu.

Stos jest bardzo zależny od tego czym kompilujesz, nie powinieneś w ogóle alokować nic dużego na stosie, ja już zacząłbym alokację na stercie od > 2KB.

Skoro nie umiesz dobrze jeszcze wskaźników, to daję Ci gotowe rozwiązanie, prawie w ogóle się tu nic nie zmienia:


#include <iostream>
#include <cstring>
 
int main()
{
    char *a = new int[1000000];
    char *b = new int[1000000];
    char *c = new int[1000000];
    int d=0;
    std::cin>>a;
    std::cin>>b;
    std::cin>>c;
    for(int i=0;i<strlen(a);i++)
    {
        if ((a[i]==b[i] && a[i]!=c[i]) || (a[i]!=b[i] && a[i]==c[i]))
            d++;
        else if (a[i]!=b[i] && b[i]==c[i])
            d=d+2;
        else if (a[i]!=b[i] && b[i]!=c[i])
            d++;
    }
    std::cout<<d<<std::endl;
    delete[] a;
    delete[] b;
    delete[] c;
    return 0;
}

 

komentarz 7 sierpnia 2017 przez Kamil Paradowski Użytkownik (620 p.)
Nie powinno być na samym dole:

delete [] a;

I tak po kolei aż do c?
komentarz 7 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
Jasne, że powinno, wybacz szybko z palca pisałem bez testu.
komentarz 7 sierpnia 2017 przez Kamil Paradowski Użytkownik (620 p.)
W teorii znam wskaźniki i inne bardziej zaawansowane metody, ale muszę sobie to przećwiczyć w praktyce, żeby to przyswoić.

Dzięki za pomoc, jutro poeksperymentuje z tym!

Podobne pytania

0 głosów
2 odpowiedzi 674 wizyt
+1 głos
3 odpowiedzi 2,309 wizyt
pytanie zadane 17 czerwca 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 375 wizyt
pytanie zadane 26 lutego 2022 w C i C++ przez Rafek Nowicjusz (120 p.)

93,743 zapytań

142,682 odpowiedzi

323,299 komentarzy

63,330 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...