c - 如何在C中存储不同类型的数据?
问题描述
我想存储一些数据,这些数据可以是仅在运行时才知道的不同类型。我不想浪费任何内存,我想将所有数据读取为浮点值。在 C++ 中,我会做这样的事情
struct IA {
virtual float value(int index) = 0;
};
template<class T>
struct A : public IA {
A(T* bytes, uint32_t size) {
values.resize(size);
memcpy(values.data(), bytes, size*sizeof(T));
}
float value(int index) override {
return static_cast<float>(values[index]);
}
std::vector<T> values;
};
int main() {
uint16_t bytes[] = {1, 2, 3, 4, 5 };
IA *a = new A<uint16_t>(bytes, 5);
float value = a->value(0);
delete a;
}
我的问题是如何使用 C 而不是 C++ 来完成。我可以将数据存储在uint8_t
数组中并存储 nr 个位和一个signed
值。然后每次我从数组中读取一个值时使用一个开关盒和一个强制转换。但是如果数组很大并且有很多读取,那将是昂贵的。
我还希望能够传递数组而不必做任何特殊情况?
解决方案
您可以使用函数指针模拟虚方法:
typedef struct
{
void* userData;
float (*value)(void*, int);
} IA;
float get_float_from_uint16(void* userData, int index)
{
return ((uint16_t*) userData)[index];
}
int main()
{
uint16_t bytes[] = {1, 2, 3, 4, 5 };
IA a = {bytes, &get_float_from_uint16};
int index = 0;
float f = a.value(a.userData, index);
}
推荐阅读
- javascript - 等待 React 组件中的异步函数并显示 Spinner
- c# - 将 DatePicker 转换为 DateTime 并存储在 db 中
- c# - NETSDK1073:无法识别 FrameworkReference 'Microsoft.AspNetCore.App'
- javascript - Django REST 框架:错误 [“类型不正确。预期的 pk 值,已收到 str。” ]
- javascript - 暂停网络上的动画
- excel - VBA - 想要自动将总和结果放在底部
- sails.js - Sails.js 上每个请求类型的替代数据存储
- c# - 在 Gridview 的每一行中添加不同的数字
- javascript - axios 无法通过 ID react 获取对象
- maven - 带有插件/扩展的定制构建的 Maven 最佳实践?