具有第一个大小写整数的奇怪输出

时间:2013-03-30 03:48:48

标签: c debugging output sieve-of-eratosthenes sieve

以下是两个完全编译的函数,但我似乎得到了第一个输入整数的奇怪错误。我已经尝试在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的任何整数的情况。最后一个或最后两个素数打印非常大的数字,有时甚至是负数。我不知道为什么,但在第一个输入的值之后一切都很完美。尝试用GDB调试这个疯狂但没有运气。非常感谢某人帮助解决这个奇怪的错误

2 个答案:

答案 0 :(得分:2)

您没有将sieves数组初始化为0。所以你从0循环到usernum-1,打印出不是0的所有数字。因为你没有初始化数组,所以第二个元素是一个随机值,正在打印出来< / p>

答案 1 :(得分:0)

此代码存在问题:

(*array) = sieve;

您要将sieve临时本地数组的地址分配给*array。您需要复制数组内容。

您是否this person曾询问过有关identical code的三个问题?