この投稿に記載されている回答をよりよく理解するために、次の循環バッファーの実装が可能かどうか、可能でない場合はその理由を説明してください。
#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 であり、逆参照しても問題ないことをコンパイラに伝えるにはどうすればよいでしょうか? ここで何かが起こっているのですが、私には理解できません。