構造体の配列を調べて、特定のメンバーの値が入力と一致するものを返すことができる関数を作成しようとしています。男がよく知っている問題を抱えている別のスレッドを見つけましたが、私にはうまくいかないようです。他のスレッドはここにあります: Get a struct based on member values
私は構造体を持っています:
typedef struct
{
uint8_t register_id;
uint8_t size; //In bytes
char * name;
char * access;
} Register;
これらの配列を作成しました:
Register VN100_registers[4] = {
{9, 16, "Attitude Quaternion", "read only"},
{17, 12, "Magnetic measurements", "read only"},
{18, 12, "Acceleration measurements", "read only"},
{19, 12, "Angular rate measurements", "read only"},
};
私はこの機能を使用します:
static Register* GetVN100Register(const void* value_ptr, const size_t offset, const size_t field_size)
{
for (uint32_t i = 0; i < N_ELEMS(VN100_registers); i++)
{
if (0 == memcmp(value_ptr, ((unsigned char*)&VN100_registers[i])+offset, field_size))
{
return &VN100_registers[i];
}
}
return NULL;
}
メンバー値が関数入力と一致する配列 VN100_registers 内の構造体を指すことになっています。
変数を初期化します。
Register *test_ptr;
uint32_t value_to_find;
そして関数を呼び出します:
value_to_find = 18;
test_ptr = GetVN100Register(&value_to_find, offsetof(Register, register_id), sizeof(value_to_find));
配列の 3 番目の構造体を指す必要がありますが、デバッグすると次のようになります。