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

question-closed spoj - StringMerge - Błąd SIGABRT - uwaga cały kod

Object Storage Arubacloud
0 głosów
769 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez eighty Nowicjusz (190 p.)
zamknięte 30 sierpnia 2016 przez draghan

Witam, robie zadanie StringMerge(http://pl.spoj.com/problems/PP0504B/) na spoju, niestety sędzia wywala mi błąd SIGABRT. Program kompiluje się normalnie w codeblocksie. Byłbym bardzo wdzięczny gdyby ktoś sprawdził kod i powiedział mi co jest nie tak.

// Kod usunięty ze względu naruszenia Regulaminu - draghan

komentarz zamknięcia: Otrzymano satysfakcjonującą odpowiedź

3 odpowiedzi

+1 głos
odpowiedź 29 sierpnia 2016 przez Szykem2 Nałogowiec (29,510 p.)
wybrane 30 sierpnia 2016 przez eighty
 
Najlepsza
Nie wywala Ci segfaulta jak uruchamiasz u siebie? Powinno bo jest poważny błąd.

Linia 58 tworzysz pojedynczego char'a a nie tablicę char'ów i operujesz na wskaźniku jak na tablicy. Przy drugim (str_index+i) musi zostać wyrzucone naruszenie ochrony pamięci. Jeśli tego nie masz u siebie sugeruję zmienić kompilator/środowisko uruchomieniowe. Dodatkowo operując na c-stringach na końcu musisz dodać znak końca łańcucha '\0'. Czyli zaalokować musisz tablicę o 2 * smaller + 1 elementach.
komentarz 30 sierpnia 2016 przez Szykem2 Nałogowiec (29,510 p.)
Dziwne mi spoj akceptuje rozwiązanie a zmieniłem tylko alokowanie tablicy(linia 58) i dodałem znak końca łańcucha, który i tak nie jest wyświetlany przez Twój program.. SIGABRT mówi, że program nie może się wykonać. Musiałeś zmienić coś jeszcze w kodzie
komentarz 30 sierpnia 2016 przez unknown Nałogowiec (39,560 p.)
"Przy drugim (str_index+i) musi zostać wyrzucone naruszenie ochrony pamięci."
Prędzej nadpisze sobie jakąś inną zmienną niż wywali segfault.
komentarz 30 sierpnia 2016 przez eighty Nowicjusz (190 p.)
edycja 30 sierpnia 2016 przez eighty
Ok, nagle zadziałało i nie do końca wiem dlaczego. Dzięki za pomoc.
komentarz 30 sierpnia 2016 przez Szykem2 Nałogowiec (29,510 p.)
@unknown zauważ, że w tym miejscu iteruje po stercie, a nie po stosie. Na stosie żaden problem bo jeżeli pamięć nie jest oznaczona jako zastrzeżona to segfaulta nie wywali, ale na stercie już powinno go wywalić, bo nie jesteśmy w ogólnodostępnej pamięci.
komentarz 30 sierpnia 2016 przez unknown Nałogowiec (39,560 p.)
Sterta to jest zwykła strona pamięci po której nasz proces może sobie pisać
Nie ma sensu gdybać co się stanie. Próba czytania lub pisania poza tablicą to UB. Wszystko zależy od tego w jakim miejscu na stercie tablica została zaalokowana i jaka strona pamięci znajduje się za stertą.
+1 głos
odpowiedź 30 sierpnia 2016 przez Death_Note Początkujący (440 p.)
edycja 30 sierpnia 2016 przez Death_Note

Spoj nie bada implementacji algorytmu, tylko wynik programu. Jest jak szef, który oczekuje poprawnego i szybkiego rozwiązania. Wcale nie potrzebujesz dynamicznie alokowanej tablicy, bo dla tak oczywistego problemu jest krótsza ścieżka. Wykorzystaj tablice string w końcu, to c++, a nie c. Dlatego z całą pewnością zadanie jest napisane niepoprawnie i każe wykorzystać jedną z przyprostokątnych w trójkącie, zamiast przeciwprostokątnej c. Oto moja koncepcja dla tej łamigłówki. Pozdrawiam.

https://gist.github.com/anonymous/4452a59069b6092ae3d164c677573b61

1
komentarz 30 sierpnia 2016 przez Kasztan Dyskutant (8,080 p.)
Jedna ze wskazówek, które dałem zmniejszają ilość kodu. Wgl ostro sobie polecieliście wrzucając kod na to forum. Już chociaż mogliście to w jakiegoś ideone wrzucić i podać linki xD
komentarz 30 sierpnia 2016 przez Death_Note Początkujący (440 p.)
Dziękuję za komentarz. Nie miałem świadomości, że tak prosty kod należy opublikować na innej stronie i wstawić linka. Bardzo przepraszam za naruszenie regulaminu. Poprawiłem już mój błąd. Pozdrawiam bardzo serdecznie.
1
komentarz 30 sierpnia 2016 przez draghan VIP (106,230 p.)

Nie o to chodziło. ;) Pytanie w ogóle nie powinno zostać zadane w taki sposób.

Punkt II 2. J.:

w przypadku pytań, dotyczących serwisu SPOJ, zabronione jest wstawianie całego kodu dotyczącego zadania.

Nic się nie stało, po prostu nie powinno się wstawiać kodu, który rozwiązuje zadanie z serwisu SPOJ.

0 głosów
odpowiedź 30 sierpnia 2016 przez Kasztan Dyskutant (8,080 p.)
Czemu deklarujesz w pętli tablice char ? I z tego co widzę powinny mieć one wielkość 1001. Brzydkie te ify na początku w funkcji string_merge użyj min/max z biblioteki algorithm. To pierwsze błędy

Podobne pytania

0 głosów
1 odpowiedź 1,008 wizyt
pytanie zadane 17 lipca 2017 w SPOJ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 155 wizyt
pytanie zadane 22 grudnia 2018 w C i C++ przez Natalia Hołub Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 264 wizyt
pytanie zadane 16 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...