6

void ポインターを使用して C で基本的なキュー構造を実装しました。手順は次のとおりです。

  • 構造体の初期化 - キューに格納する変数の型のサイズを設定しました
  • プッシュ - 格納する変数へのポインターを渡すと、キューはそれ自体のコピーを取得します
  • front - 構造体は void* を前の要素に返します。ポインタをつかむだけかもしれませmemcpy()んし、ローカル コピーを持っているかもしれません。

構造体自体は次のようになります。

struct queue
{
    void* start;    //pointer to the beginning of queue
    void* end;      //-||- to the end
    size_t memsize; //size of allocated memory, in bytes
    size_t varsize; //size of a single variable, in bytes
    void* initial_pointer;      //position of the start pointer before pop() operations
};

start と end は、現在割り当てられているメモリ ブロック内のある場所を指す単なる void ポインターです。要素をキューにプッシュすると、エンド ポインターが だけインクリメントされvarsizeます。pop() の場合、エンド ポインターも だけ減分しますvarsize

ここに関数コードを投稿する必要はないと思います。100 行を超えています。

質問:これは良い習慣と考えられますか、それとも悪い習慣と考えられますか? なぜだめですか)?

注: C のキューには他にも多くのオプションがあることは承知しています。このオプションの品質について質問しているだけです。

編集: 実装はここで入手できます: http:// 89.70.149.19 /stuff/queue.txt (スペースを削除してください)

4

2 に答える 2

8

void *キューに格納されるオブジェクトの型とサイズがわからない場合は、これを使用してもかまいません (実際、C 標準ライブラリは同じアプローチに従います。いくつかの例についてはmemcpy()およびqsort()関数を参照してください)。ただし、キューに格納されている要素のサイズを指定するためにsize_t(またはssize_t符号付きデータ型が必要な場合は) を使用することをお勧めします。

于 2013-07-18T19:15:13.400 に答える
2

あなたは本当にあなたの実装について確信するのに十分なことを私たちに示していません. void*ユーザーデータ項目は問題ありませんが、C ではそれ以外のことはほとんどできません。

しかし、個々のアイテムを管理するために使用する内部リスト要素タイプがあると強く思います。

struct list_item {
  struct list_item* next;
  void* data;
};

その場合で、ポインターstartendポインタがそのような要素を指している場合は、struct queue宣言で要素の型を使用する必要があります。

struct queue
{
    struct list_item* start;    //pointer to the beginning of queue
    struct list_item* end;      //-||- to the end
    size_t memsize; //size of allocated memory, in bytes
    size_t varsize; //size of a single variable, in bytes
    struct list_item* initial_pointer;      //position of the start pointer before pop() operations
};

struct list_itemこれが機能するために、 の定義を のユーザーに公開する必要さえありませんstruct queue

于 2013-07-18T19:32:02.540 に答える