0

C でバケット ソート プログラムを作成しています。小さなバケットを大きなバケットにマージした後、小さなバケットにパディングした -1 を削除する必要があります。

私はCにかなり慣れていないので、見落としている非常に単純な解決策があるかもしれません。

これは、トリムされていないバケットのサイズになるまで、配列を埋める 1 つの末尾のジャンク値と末尾の 0 を持つ配列を返すように見える私の解決策でした (目的の結果は、-1、ジャンク値、末尾の 0 のないバケットです)。 )。

    // A function to trim a bucket of a given size to a bucket containing no -1s
    int* trimBucket(int* bucket, int size)
    {
        int n = 0, i = 0;
        int* newBucket;

        // This loop is to count the number of elements between 0 and 9999
        for(n = 0; n < size; n++) 
        {
            if(bucket[n] != -1 && bucket[n] < 10000)
                i++;
        }

        // Create a new bucket equal to the number of elements counted
        // Filled with -2 to differentiate from -1s contained in the bucket array
        newBucket = allocateAndInitiateOneD(i, -2); 
        i = 0;

        for(n = 0; n < size; n++)
        {
            // I only want values between 0-9999 to be put into the new array
            if(bucket[n] != -1 && bucket[n] < 10000) 
            {
                newBucket[i] = bucket[n];
                i++;
            }       
        }

        free(bucket); // Am I doing this right?
        return newBucket;
    }

allocateAndInitiateOneD 関数:

    // A function to allocate memory for a one dimensional array and fill it with the given value
    int* allocateAndInitiateOneD(int x, int initialNum)
    {
        int runs = 0;
        int* oneArray;

        oneArray = malloc(sizeof(int) * x);

        for(runs = 0; runs < x; runs++)
            oneArray[runs] = initialNum;

        return oneArray;
    }

誰かが私が間違っていることと、どうすれば望ましい結果を得ることができるかを理解するのを手伝ってくれませんか?

助けてくれてありがとう!

編集: Unix システムでコンパイルして実行しています。おそらく関係ありませんが、これは MPI ライブラリを使用したマルチプロセス プログラムです (これは問題の場所ではないようです)。

4

1 に答える 1

1

すべてが機能しているように見えますが、この関数からも新しいサイズを返す必要があります。配列の長さを考えなくても、新しく選択したサイズの最後からすぐに読み取ることができ、ゴミのように見えます (1末尾のジャンク値とすべてゼロ...)。

C の配列には、常に 2 つの部分があります。開始ポインタとサイズ。サイズが暗示的な場合もありますが、何らかの方法でそこにある必要があります。そうしないと、永遠に読み続けることになります。

関数から複数のものを返す必要がある場合は、次のいずれかを行います。

  • ポインターパラメーターを介して (1 つまたは両方) を返す
  • 構造体を介して両方を返します
于 2013-07-31T20:40:58.810 に答える