11

この投稿に記載されている回答をよりよく理解するために、次の循環バッファーの実装が可能かどうか、可能でない場合はその理由を説明してください。

#define CB_TYPE_CHAR     0
#define CB_TYPE_FLOAT    1

...

typedef struct CBUFF
{
    uint16 total;       /* Total number of array elements */
    uint16 size;        /* Size of each array element */
    uint16 type;        /* Array element type */
    uint16 used;        /* Number of array elements in use */
    uint16 start;       /* Array index of first unread element */
    void *elements;     /* Pointer to array of elements */
} CBUFF;

...

void cbRead(CBUFF *buffer, void *element)
{
    if (buffer->type == CB_TYPE_CHAR)
    {
    /* The RHS of this statement is the problem */
        *(char*)element = *(buffer->elements[buffer->start]);
    }

    /* Other cases will go here */

    buffer->start = (buffer->start + 1) % buffer->total;

    --buffer->used;
}

void ポインターを逆参照できるように、LHS を char にキャストする必要があることを理解しています。また、次のコード フラグメントも理解しています。

buffer->elements[buffer->start]

elements 配列の 'buffer->start' 要素のアドレスを指定します。これも、そのアドレスの内容を取得するために逆参照したいと考えています。または、少なくともそれは私がK&Rから取ったものです.

以上のことから、そのアドレスのメモリの内容が char であり、逆参照しても問題ないことをコンパイラに伝えるにはどうすればよいでしょうか? ここで何かが起こっているのですが、私には理解できません。

4

2 に答える 2

14

buffer->elementsもであるvoid *ため、何かを行う前にキャストする必要があります。

*(char*)element = ((char *)buffer->elements)[buffer->start];
于 2012-12-04T01:48:08.947 に答える
5

以上のことから、そのアドレスのメモリの内容が char であり、逆参照しても問題ないことをコンパイラに伝えるにはどうすればよいでしょうか?

さて、あなたはすでにその行の LHS でそれを行っています:

*(char*)element = *(buffer->elements[buffer->start]);

デリファレンスbuffer->elements[n]するには、それもキャストする必要があります。

*(char*)element = *((char*)buffer->elements)[buffer->start];

問題は、そのキャストが正しいかどうかです。の初期化を投稿していないので、それは言えませんbuffer->elements

于 2012-12-04T01:35:18.610 に答える