Странный вывод с первым регистром
Ниже приведены две функции, которые прекрасно компилируются, но я, кажется, получаю странную ошибку с самым первым введенным целым числом. Я попытался отладить в GDB, но когда это только первое введенное значение, которое имеет эту странную ошибку, то это усложняет ситуацию.
#include <stdio.h>
#include "Assg9.h"
#include <stdlib.h>
#include <assert.h>
#include <math.h>
void getPrimes(int usernum, int* count, int** array){
(*count) = (usernum - 1);
int sieve[usernum-1], primenums = 0, index, fillnum, multiple;
for(index = 0, fillnum = 2; fillnum <= usernum; index++, fillnum++){
sieve[index] = fillnum;
}
for (; primenums < sqrt(usernum); primenums++)
{
if (sieve[primenums] != 0){
for (multiple = primenums + (sieve[primenums]); multiple < usernum - 1; multiple += sieve[primenums])//If it is not crossed out it starts deleting its multiples.
{
if(sieve[multiple]) {
--(*count);
sieve[multiple] = 0;
}
}
}
}
int k;
for (k = 0; k < usernum; k++)
if (sieve[k] != 0)
{
printf("%d ", sieve[k]);
}
*array = malloc(sizeof(int) * (usernum +1));
assert(array);
(*array) = sieve;
}
void writeToOutputFile(FILE *fpout, const int *array, int n, int count){
int i;
fprintf(fpout, "There are %d prime numbers less than or equal to %d \n", count, n);
for(i = 0; i < count; i++)
{
if(*(array + i) != 0){
fprintf(fpout, "%d ", *(array + i));
}
}
}
Наш выход:
Please enter an integer in the range 2 <-> 2000 both inclusive: 2
2 32664
Do you want to try again? Press Y for Yes and N for No: y
Please enter an integer in the range 2 <-> 2000 both inclusive: 2
2
Do you want to try again? Press Y for Yes and N for No: n
Good bye. Have a nice day
Ожидаемый результат должен, очевидно, просто отображать 2. Это случай для любого целого числа от 2 до 2000 для самого первого введенного целого числа. Самые последние или последние 2 простых числа печатают очень большие числа, иногда даже отрицательные числа. Понятия не имею почему, но после первого введенного значения все работает отлично. Пробовал отлаживать это с GDB как сумасшедший, но безуспешно. Буду очень признателен за чью-то помощь за эту причудливую ошибку
2 ответа
Вы не инициализируете массив сит до 0 с. Таким образом, вы переходите от 0 к usernum-1, распечатывая каждое число, которое не является 0. Поскольку вы не инициализировали массив, 2-й элемент является случайным значением и выводится на печать
Этот код является проблемой:
(*array) = sieve;
Вы назначаете адрес sieve
временный локальный массив, чтобы *array
, Вместо этого вам нужно скопировать содержимое массива.
Вы тоже Hetero Myde, который задал три вопроса об идентичном коде?