Итак, эта функция, которую я создал, использует алгоритм Решета Эратосфена для вычисления всех простых чисел ‹= n. Эта функция хранит в параметрах простые числа и количество простых чисел.
Когда функция завершается, простые числа должны указывать на блок динамически выделяемой памяти, который содержит все простые числа ‹= num. *count
будет иметь количество простых чисел.
Вот моя функция getPrimes
:
void getPrimes(int num, int* count, int** array){
(*count) = (num - 1);
int sieve[num-1], primenums = 0, index, fillnum, multiple;
//Fills the array with the numbers up to the user's ending number, num.
for(index = 0, fillnum = 2; fillnum <= num; index++, fillnum++){
sieve[index] = fillnum;
}
/* Starts crossing out non prime numbers starting with 2 because 1
is not a prime. It then deletes all of those multiples and
moves on to the next number that isnt crossed out, which is a prime. */
for (; primenums < sqrt(num); primenums++) //Walks through the array.
{
//Checks if that number is NULL which means it's crossed out
if (sieve[primenums] != 0) {
//If it is not crossed out it starts deleting its multiples.
for (multiple = (sieve[primenums]);
multiple < num;
multiple += sieve[primenums]) {
//Crossing multiples out
//and decrements count to move to next number
sieve[multiple + primenums] = 0;
--(*count);
}
}
}
int k;
for(k=0; k < num; k++)
printf("%d \n", sieve[k]);
printf("%d \n", *count);
array = malloc(sizeof(int) * (num + 1));
assert(array);
(*array) = sieve;
}
Теперь вот предполагаемый результат и мой результат. Как видите, в моей getPrimes
функции что-то не так, но я не уверен, что именно.
Intended Output: There are 8 prime numbers less than or equal to 19 2 3 5 7 11 13 17 19 My Output: 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 0 0
Вот 3 проблемы, на которые мне пока что указали:
- Неправильный процесс удаления
if (sieve[multiple]) {
индекс сита массива имеет смещение (*array) = sieve;
утекает только что созданную память и позволяет*array
указывать на локальную переменную, которая перестает существовать, когда функция возвращает значение - вы получите висящий указатель.if(sieve[i] != NULL)
должен использовать 0, а не NULL, у вас нет массива указателей.
Однако я не совсем уверен, как исправить проблему с зависшим указателем / памятью, которая была замечена мной. Кроме того, мне было интересно, есть ли в моем коде что-нибудь еще с ошибками, поскольку я не слишком уверен, почему мои числа в моем выводе добавляют 0 ... не беспокойтесь о другом стиле вывода, только о дополнительных числах . Спасибо, если поможете мне с этим!