思うように解決できないのかもしれませんが、よくわからないので質問させてください...
ユーザーが必要な数のアイテムで初期化できるように、動的配列を使用して単純な Queue を実装しました。void
また、任意のデータ型を許可するためにポインターを使用しようとしていますが、それが問題です。
これが私のコードです:
typedef void * QueueValue;
typedef struct sQueueItem {
QueueValue value;
} QueueItem;
typedef struct sQueue {
QueueItem *items;
int first;
int last;
int size;
int count;
} Queue;
void queueInitialize(Queue **queue, size_t size) {
*queue = xmalloc(sizeof(Queue));
QueueItem *items = xmalloc(sizeof(QueueItem) * size);
(*queue)->items = items;
(*queue)->first = 0;
(*queue)->last = 0;
(*queue)->size = size;
(*queue)->count = 0;
}
Bool queuePush(Queue * const queue, QueueValue value, size_t val_sz) {
if(isNull(queue) || isFull(queue)) return FALSE;
queue->items[queue->last].value = xmalloc(val_sz);
memcpy(queue->items[queue->last].value, value, val_sz);
queue->last = (queue->last+1) % queue->size;
queue->count += 1;
return TRUE;
}
Bool queuePop(Queue * const queue, QueueValue *value) {
if(isEmpty(queue)) return FALSE;
*value = queue->items[queue->first].value;
free(queue->items[queue->first].value);
queue->first = (queue->first+1) % queue->size;
queue->count -= 1;
return TRUE;
}
問題はqueuePop
機能にあります。呼び出すと、すぐに解放するため、値が失われます。このジレンマを解決できないようです。ライブラリを汎用的でモジュール化したいと考えています。ユーザーはメモリの割り当てと解放を気にする必要はありません。それはライブラリの仕事です。
ユーザーはどのようにして値を取得しqueuePop
、ライブラリにすべてのメモリ割り当て/解放を処理させることができますか?