0

以下の 2 つの関数は完全にコンパイルされますが、最初に入力された整数で奇妙なエラーが発生しているようです。私は 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でこれをデバッグしようとしましたが、うまくいきませんでした。この奇妙なエラーについて誰かの助けを本当に感謝します

4

2 に答える 2

2

sieves 配列を 0 に初期化していません。したがって、0 から usernum-1 までループして、0 以外のすべての数値を出力しています。配列を初期化していないため、2 番目の要素はランダムな値であり、出力されています。

于 2013-03-30T03:55:21.510 に答える
0

このコードは問題です:

(*array) = sieve;

一時ローカル配列のアドレスをsieveに割り当てています。代わりに配列の内容をコピーする必要があります。*array

あなたは同じコードについて 3 つの質問をしたこの人ですか?

于 2013-03-30T04:19:11.523 に答える