Mam program: kod.
W czym tkwi problem?
SIGSEGV why?
- Rejestracja: dni
- Ostatnio: dni
Skoro piszesz w C++ to wypadałoby zgodnie ze standardem. Taka deklaracja tablicy jest z nim niezgodna. Zapewne błąd jest przez to, że przepełniasz stos (jeżeli n będzie wystarczająco duże)
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
Bo int tab[n] nie jest poprawnym sposobem deklarowania tablicy, jeśli n nie jest stałą znaną na etapie kompilacji.
- Rejestracja: dni
- Ostatnio: dni
Utwórz tą tablicę o rozmiarze maksymalnym jaki może być potrzebny i zadeklaruj ją przed pętlą.
Swoją drogą to niepotrzebnie komplikujesz sobie życie tym switchem dla boola.
Typ danych też mogłeś sobie skrócić:
typedef long long unsigned int lluint;
Mógłbyś podać wejście dla którego był problem?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 4
Ustosunkowując się do wypowiedzi @byku_guzio i @Navi po zmianie, błąd nadal występuje...
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
- Jesteś pewien ze taka tablica na stosie ci się zmieści? Rozumiem ze poklócileś się z "new" ?
- Jesteś pewien ze wykraczasz poza tablicę?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2520
a może spróbuj wysłać jakieś wejście do programu :D
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2520
a) bool arry[n+1]; // to jest źle, takie coś wrzuca się na stertę (bool* arry = new bool[n+1],delete [] arry;)
b) należy zainicjować tą tablicę true lub false, bo nie wiesz jakie wartości będą miały komórki bo zaalokowaniu pamięci
c) konstrukcja: switch (...) { case x: break; default: {} } // WTF? :
- zastanów się co robi break, jak już to użyj continue,
- zwykły if będzie bardziej przejrzysty
d) lepiej liczby pierwsze obliczyc 1 raz, a pozniej korzystac z obliczonych wynikow, niz za kazdym razem je liczyc: ewentualnie można zapisać sobie dokąd są już obliczone i sprawdzać kolejne jeśli jest taka potrzeba.
- Rejestracja: dni
- Ostatnio: dni
pewnie to chciałeś napisać: http://ideone.com/581wP
- Rejestracja: dni
- Ostatnio: dni
Pokaż aktualny kod, bez tego nic się nie zrobi.
- Rejestracja: dni
- Ostatnio: dni
Wychodzisz poza tablicę. Daj new bool[n+1]. Nigdzie nie inicjujesz zawartości tablicy, więc większość jak nie wszystko jest tam na true (wartość różna od zera).
- Rejestracja: dni
- Ostatnio: dni
Poza tym:
- wartość 1 000 000 000 spokojnie zmieści się w
int, nie ma potrzeby używania 64-bitów - program może stworzyć tablicę o wielkości 1 000 000 000 bajtów, to jest prawie 1GB pamięci
- Sito Eratostenesa jest optymalne do liczenia liczb pierwszych do 10 milionów, poszukaj sobie w google
segmented sieve of eratosthenes - do usuwania tablic służy
delete [], teraz być może wycieku nie tworzysz, ale jakbyś miał tablicę jakiś obiektów to nie zostaną wywołane ich destruktory, generalnie jest to undefined behaviour i komputer może się zepsuć - do tego typu zadań na spoju, gdzie jest duża ilość danych do wczytania i wyświetlenia o wiele lepiej sprawi ci się
(c)stdio.