1

入力が何らかのフィルタリングを行い、結果を同じポインター配列に戻すときに、符号なし整数の配列へのポインターを受け取るCでアルゴリズムを作成しています。これは私がしました:

static void Filtering(Inst_t *psStruct, uint8 *arraypointer)
{
    uint8 *arrayFilter; 
    uint32 i, n = 0, uCount;
    uCount = psStruct->uCount;   

    for (i = 0; i < uCount; i++)
    {        
       arraypointer[i]  = (arraypointer[i] + arraypointer[i - 1] +  arraypointer[i + 1])/3;     
    }
}

データが上書きされます。しかし、私はそれが起こることを望んでいません。したがって、ポインターが指している配列データのローカルコピーを作成し、それを使用して平均を計算し、計算された値を返します。

*arraypointer のサイズの配列を割り当て、ポインター配列の値で初期化し、代わりにこのローカル コピーを使用することを考えています。理論的には、これは理にかなっていますが、これが最善の方法であるかどうかはわかりません。

この問題に対処するためのポインタ/コードは高く評価されています。助けてください。

前もって感謝します。

4

3 に答える 3

1

データを変更したくない場合は、なぜ関数がそれを行うのですか?独自のプログラム設計を回避する方法を考案する代わりに、関数の定義を変更して、別の方法で実装します。

static void Filtering (Inst_t *psStruct, 
                       const uint8_t* source, 
                       uint8_t* result)

次に、発信者で:

uint8_t* filtered_buf = malloc (sizeof(buf));

Filtering(some_struct, buf, filtered_buf);

free(filtered_buf);
于 2013-02-27T08:10:23.910 に答える
1

もちろん。これは、新しい配列を返す関数を実装する完全に正当な方法です。

これを行うと、要素をすばやくコピーできます。

uint8 *newarray = malloc(uCount * sizeof(uint8));
memcpy(newarray, arraypointer, uCount * sizeof(uint8));

/* do work on newarray */
return newarray;

関数が動的に割り当てられた配列を返すことを必ず文書化し、完了したら必ず解放してください。

于 2013-02-27T07:30:13.260 に答える
0

uCountフィールドで利用可能な要素の数があるように見えるので、確かにローカル コピーを作成できます。

ただし、平均を計算すること (読み取り専用操作) だけが必要な場合は、ローカル コピーが必要な理由がわかりません。

コピーを作成するには、次のようにします。

const size_t num_bytes = psStruct->uCount * sizeof *local;
uint8 *local = malloc(num_bytes);
memcpy(local, arraypointer, num_bytes);

localもちろん、NULLそれは使用前ではなく、関数から戻る前に確認する必要があります (結果として新しい配列が必要なfree()場合を除きます。その場合、完了時に呼び出し元の責任になります)。returnfree()

于 2013-02-27T07:30:24.730 に答える