4

内容から循環バッファーの構造を抽象化したい場合、次のコード セグメントから始めます (このウィキペディア エントリの厚意による)。

typedef struct
{ 
    int value;
} ElemType;

typedef struct
{
    int         size;      /* total number of elements */
    int         start;     /* index of oldest element */
    int         count;     /* index at which to write new element  */
    ElemType   *elements;  /* vector of elements */
} CircularBuffer;

void cbInit(CircularBuffer *cb, int size) {
    cb->size  = size;
    cb->start = 0;
    cb->count = 0;
    cb->elements = (ElemType *)calloc(cb->size, sizeof(ElemType));
}

CircularBuffer のインスタンスが定義されるときに指定されるように、要素の型をどのように抽象化しますか? これまでの私の試みは次のとおりです。

CircularBuffer *cbInit(uint16 size, void *element)
{
    CircularBuffer *buffer;

    buffer = malloc(sizeof(*buffer));

    if (buffer != NULL)
    {
        buffer->size = size;
        buffer->start = 0;
        buffer->count = 0;
        buffer->elements = (void *)calloc(size, sizeof(???));

        if (buffer->elements == NULL)
        {
            free(buffer);
            buffer = NULL;
        }
    }

    return buffer;
}

しかし、int、struct、またはその間の何かである可能性がある未知の型のサイズを決定する方法がわかりません。私がやろうとしていることは可能ですか?

4

1 に答える 1

7

ご存知のように、未知のデータのサイズを自動的に判断することはできません。固定要素タイプ(void*一般的な選択として適切)が必要になるか、ユーザーに各要素のサイズを渡してもらう必要があります。

CircularBuffer *cbInit(uint16 size, int elementSize)
{
    ...
    buffer->elementSize = elementSize;
    buffer->elements    = calloc(size, elementSize);  
}
于 2012-11-29T02:53:13.330 に答える