Sito Eratostenesa - Problem z pamięcią?

0

Witajcie

Nie wiem, czy będę w stanie dokładnie wyjaśnić mój problem. Otóż, jako projekt częściowy, otrzymałem do wykonania Sito Eratostenesa. Wiadomo do czego służy. Napisałem cały kod i już miałem oddać swój projekt, gdy na komputerze w pracowni, po wpisaniu górnej granicy ciągu np. 34 dla jakiego ma wypisać liczby pierwsze, zgłaszał się błąd, związany z pamięcią, a dokładnie, że jakaś komórka pamięci nie mogła być "read". Prowadzący zajęcia nie doszukał się błędu i stwierdził, że muszę wybadać co jest nie tak sam. Nie mogę wpaść na żadne rozwiązanie, patrząc się na kod. Dodam, jeszcze, że po ponownym uruchomieniu komputera w pracowni, nie wysypywał się już na górnej granicy 34. Podejrzewam, że mógł być wtedy problem z inną liczbą, a 34 była przypadkiem i gdybym na nią nie trafił, byłbym przekonany, że program działa.

#include <iostream>
#include <cmath>

using namespace std;

class Sito {
private:
int rozm;
int *tablica;
public:
Sito();

Sito(int rozmiar) {
rozm = rozmiar;
tablica = new int[rozm];
for(int i=0;i<rozm;i++) {
tablica[i]=1;
}
};

void odsiej(void) {
for (int i = 2; i*i <= rozm; ++i )
{
if (tablica[i] == false)
continue;
for (int j = 2*i ; j <= rozm; j += i)
tablica[j] = false;
}
};

void pokaz(void) {
cout << endl << "Liczby pierwsze z przedzialu od 0 do " << rozm << endl;
for(int i=2;i<rozm;i++) {
if(tablica[i]==true)
cout << i << endl;
}
};

void sprawdz(int value) {
int control = 0;
if(value == 1 || value == 0) {
cout << "Podana liczba nie jest pierwsza" << endl;
}else {
for(int i=2;i<=sqrt(value);++i){

if(value%i==0){
++control;
break;
}
}
if(control>0) {
cout << "Liczba " << value << " nie jest liczba pierwsza" << endl;
}else{
cout << "Liczba " << value << " jest liczba pierwsza" << endl;
}
}
};

~Sito() {
delete [] tablica;
};
};

int main() {
int rozmiar;
cout << "Podaj gorny zakres: ";
cin >> rozmiar;
Sito *s1 = new Sito(rozmiar);
//cout << "Podaj liczbe do sprawdzenia: "; //zakomentowana czesc sprawdzajaca
//cin >> liczba; //czy podana liczba
//s1->sprawdz(liczba); //jest liczba pierwsza
s1->odsiej();
s1->pokaz();

return 0;
}
0

po 1 gdzie formatowanie kodu?
po 2 <= rozm jakoś niezbyt mi się podoba
po 3 błędu niestety nie udało mi się odtworzyć, jakieś wartości dla jakich się pojawia?

0
kaczkazdw napisał(a):

jakaś komórka pamięci nie mogła być "read".

Ostatnio napisałem bardzo podobny program, jest w newbie. Weź go,
minimalnie przerób i nie będzie się wywalał :)

0

Są to losowe wartości. Jak wcześniej wspomniałem, raz pojawiły się dla liczby 34 a po restarcie systemu, liczba 34 była w porządku, więc podejrzewam, że była to inna wartość losowa.

0

Przydzielasz tablice na rozm elementów czyli 0..rozm-1 zaś korzystasz 0..rozm.

1 użytkowników online, w tym zalogowanych: 0, gości: 1