2013-07-18 9 views
6

voidポインタを使用してCで基本的なキュー構造を実装しました。手順は以下の通りである:構造体を初期化void *を使用したCのキュー実装 - 良いか悪いのか?

  • - Iを格納する変数へのポインタを渡す、キューは、次にグラブ - Iは、キュー
  • プッシュに格納する変数の型のサイズを設定します自身のコピー
  • 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 
}; 

開始と終了は、現在割り当てられたメモリブロック内のいくつかの場所を指すだけで無効ポインタです。キュー上の要素を押すと、終了ポインタをvarsizeだけインクリメントします。私がpop()した場合、私はちょうどvarsizeによって終了ポインタを減らします。

私はここに機能コードを載せるべきではないと思いますが、100行以上あります。

質問:これは良いか悪い練習と考えられますか?何故なの)?

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

EDITは:実装がここにあります: ます。http:あなたがタイプとサイズがわからない場合は、// 89.70.149.19の/stuff/queue.txt

+2

メモリサイズにはsize_tを使用してください –

+0

私は 'void * 'を使って汎用コードを書くのが良いと思います。 –

+0

@RanEldanありがとうございます。ここで訂正しました。 – szczurcio

答えて

8

それはvoid *を使用するためにOKです(スペースを削除します)実際には、C標準ライブラリは同じアプローチに従います(いくつかの例ではmemcpy()qsort()の関数を参照してください)。ただし、キューに格納されている要素のサイズを指定する場合は、size_t(または符号付きデータ型が必要な場合はssize_t)を使用する方がよいでしょう。

+1

Ran Eldanは既にそれを訂正していると言いました。 OK、ご意見ありがとうございます。私は実際にそれを行うのが直感的だと思うが、私はこれが「醜い」と主張する人々を見ただけだ。 – szczurcio

+2

@szczurcioあなたがあらかじめタイプを知らないと、あなたは本当に何か他のことをすることができないということです。そうした場合は、より安全な型の安全のために 'void *'を使用しないでください。 –

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の定義を公開する必要はありません。

+0

あなたは何を意味するのか分かりません。 startとendは、現在割り当てられているメモリブロック内のいくつかの場所を指すポインタだけです。私がキュー上の要素を押すと、私はvarsizeで終了ポインタをインクリメントします。私がpop()した場合は、終点ポインタも同様にvarsizeだけ減らします。 – szczurcio

+0

編集:私は私の質問のコードへのリンクを追加しました。 – szczurcio

+0

@szczurcioは、キューの非常に普遍的な実装です。普通のものは、ここで私が説明するように動的要素を持つものです。あなたは、あなたのコメントに書かれている説明を質問に追加して、参考にしてください。私はこの答えを削除しますが、あなたにはあまり役立たないでしょう。 –

関連する問題