Witam
Zainteresował mnie bardzo punkt 11) Twojej wypowiedzi. Miałem ten sam problem co autor posta (program działa w konsoli ale na ideone już nie a sędzie zwraca błąd SIGABRT). Oto mój kod (który swoją drogą nie podaje nadal poprawnej odpowiedzi, jeszcze głowie się nad tym dlaczego): https://ideone.com/Tl6aRq9 Jednak po usunięciu linii z instrukcjami "delete" już wspomniany błąd nie pojawia się. Czy mógłby ktoś wytłumaczyć od strony technicznej (sposobu działania sędziego) dlaczego tak się dzieje?
Też nie do końca wiem dla czego, ale już się nie głowię i dałem sobie spokój. Przyjmij [na wiarę], że po prostu twój kod jest tak brzydki, że kompilator nie wie jak go skompilować i tworzy błędny program. Mam na myśli nowy kompilator. Stary nie ma zastrzeżeń i jest AC
Oczywiście z kompilatorem to żart, aale reszta to szczera prawda
Dlaczego, nie mam pomysłu i po prostu przyjmij to za dobrą monetę [AC na starym kompilatorze] i na przyszłość zacznij pisać lepsze kody, a przede wszystkim pisz jak najwięcej [ i jak najlepiej].
PS
Co masz na myśli? Rozumiem, że chodzi Ci o jakąś wypowiedż tarpauwatratar'a, ale o jaką?
PS 2
@mariusz193 wyjaśnił więc tylko powtórzę.
Nawet gdybyś był problemsetterem, to na początku, do prostych zadań nie jest Ci potrzebna wiedza na temat techniki działania sędziego. Wystarczy wiedza, że wyłapuje błędy - ale czasami są problemy - tak jak tu.
U Ciebie t nie wskazuje adresu początku tablicy, więc delete [] t powoduje natychmiast błąd SIGABRT. Nie można też kasować dwukrotnie tego samego obiektu więc gdyby jednak delete [] t zadziałało to delete [] tab spowodowałoby błąd SIGABRT, ale program już wcześniej zostaje przerwany, przez delete [] t.
Coś czuję że częściej będę się udzielał na forum ze swoimi rozwiązaniami . Dzięki, naprawdę, nic tak dobrze nie robi nauce jak krytyka kodu przez kogoś bardziej kompetentnego. Ale czy mógłbyś sprecyzować co tu z grubsza jest takiego beznadziejnego? Podejrzewam że trochę mocno przesadziłem ze wskaźnikami no i też sposób sortowania nie jest zbyt górnolotny, ale to na pewno nie jedyne problemy. Idąc dalej, skąd brać Twoim zdaniem i na czym można się wzorować przeglądając "ładny" kod? A co do mojego pytania o inną wypowiedź to już wyjaśniłeś wszystko dwie linijki niżej.
Na start niech będzie nawet to https://google.github.io/styleguide/cppguide.html10 -> przykładowy sposób tworzenia ładnego kodu. Takie wtrącenie, może nie do końca zgodne z Twoim pytaniem, ale pewnie się przyda.
Nic takiego nie napisałem, a że brzydki, to był żart, [uśmiech na końcu zdania nie był ironiczny] bo nie przychodziło mi inne wyjaśnienie - w kompilatorze c++ 4.3.2 bez zmian twój kod uzyskuje AC [akccepted], w wyższym, 6.3, już nie - sam to sprawdź.
Piękność-brzydota to pojęcie względne i rzecz gustu, a o gustach się nie dyskutuje i są to [raczej] drobiazgi
Po kolei:
- Tak, trochę przesadziłeś ze wskaźnikami, i używa się ich też do uproszczenia kodu, a nie zagmatwania.
- Umieszczanie nawiasu otwierającego:
do { // tak jak preferuję
main()
{ // nie preferuję i to u Ciebie pewna drobna niekonsekwencja w stosunku do do, przecież nie masz
do
{
To samo w stosunku do innych pętli, dla mnie zawsze for (){, while(){ itd - t = tab = new int [a]
- while (a--) cin >> *t++;
- dalej w [twoim] kodzie wskaźniki nie przynoszą korzyści [w uproszczeniu zapisu kodu] w stosunku do zwykłych indeksów, a nawet [moim zdaniem] bardziej go gmatwają/zaciemniają.
- zmienna pom w my_sort jest nie używana.
- Sortowanie bąbelkowe to jak sam piszesz: "sposób sortowania nie jest zbyt górnolotny,"
Chyba tylko tyle i się nie przejmuj, czym więcej będziesz pisał [i ewentualnie czytał], tym szybciej dojdziesz do ładnego kodu: https://helion.pl/ksiazki/piekny-kod-tajemnice-mistrzow-programowania-andy-oram-greg-wilson,szpppv.htm3, Czysty kod, czy wreście https://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm2, tak dobry stary C
Stworzyłem coś takiego, na ideone wszystkie wyniki wydają się być poprawne, w codeblocks na prywatnym komputerze jednak dzieje się coś dziwnego, przy więcej niż dwóch elementach i liczbach większych od mniej więcej 100, zawsze jeden element tablicy jest zamieniany na wielokrotność 8 np. 8, 16, 32. Dzieje się to w fragmencie “//sortowanie tablicy”. Wypisanie zawartości przed tym fragmentem pokazuje dobre wartości, za nim już właśnie z tym błędem. Nie spotkałem się nigdy z takim czymś. Co może być przyczyną? Czy może to być przyczyną błędu jeśli ideone kompiluje kod poprawnie?
Przykład takiej zamiany:
P.S. Zamienienie funkcji swap na ręczną zamianę pozycji z trzecią zmienną daje ten sam efekt.
Według specyfikacji C++ nie powinieneś pisać
int liczba[N];
a
int *liczba = new int[N];
Ale twój błąd jest w pętli sortującej. Iterujesz do elementu N, ale odwołujesz się jeden element dalej:
for(int j=0;j<N;j++)
{
if(liczba[j]>liczba[j+1])
i zgarniasz jakiś przypadkowy blok pamięci do swojej tablicy. Zresztą widzę po Dlaczego tylko 3? Wiatraczki FANGEN że masz do tego szczęście
PS. Czemu nie pójdziesz o krok dalej i nie uzyjesz funkcji sort zamiast funkcji swap?
I czasami tam dalej jest wartość, która nie przeszkadza, a czasami przeszkadza, powoduje błąd.
W posortowanej tablicy, dużo łatwiej się szuka, niż w nie posortowanej, czyż nie?
PS
Czemu nie ma SIGSEG czy czegoś podobnego? Pewnie z powodu takiego [lekko błędnego] sposobu deklarowania wielkości tablicy [statyczno-pseudo-dynamicznej ]
https://ideone.com/cJk8dP12 Przyjrzał by się ktoś co nie tak ?
Hmm, zazwyczaj takie rzeczy powodują takie rzeczy jak sięganie za tablicę i do niezadeklarowanych zmiennych. Ale po szybkim przejrzeniu nie widzę czegoś takiego Twoim w kodzie. Najbardziej podejrzana byla:
swap(wyniki[h], wyniki[h + 1]);
Wtedy można sobie do tablicy wcisnąć jakieś pozostałości, które stały bezpośrenio za nią jeśli się nie uważa z indeksem tablicy. Niestety nie widzę gdzie mógłby leżeć problem.
ależ skąd - wcale się nie zawiesza, tylko cały czas pracuje i nie chce skończyć
gdybyś czytała inne wątki, to byś przeczytała, że pisanie własnej procedury sortującej to proszenie się o kłopoty (zaś próba napisania własnej quicksoert to podwójne proszenie się o kłopoty)
przecież można użyć qsort() lub sort()
dodatkowo powinnaś jeszcze co najmniej raz dokładnie przeczytać treść zadania