首页 > 解决方案 > 如何在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值。然后每次我从数组中读取一个值时使用一个开关盒和一个强制转换。但是如果数组很大并且有很多读取,那将是昂贵的。

我还希望能够传递数组而不必做任何特殊情况?

标签: cpolymorphismvirtual-functionsc11

解决方案


您可以使用函数指针模拟虚方法:

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);
}

演示


推荐阅读