我有一个分配要求为任何数据类型编写函数.该函数应该打印结构的字节并识别数据结构使用的字节总数,以区分用于成员的字节和用于填充的字节.
我的立即反应,以及大多数类的反应是使用模板.这允许您编写一次函数并收集传递给函数的对象的运行时类型.使用memset和typeid可以轻松完成所要求的内容.但是,我们的教授.刚刚看到我们关于模板和该死的模板的讨论到了地狱.
看到这个后,我被抛出一个循环,我正在寻找一个小指导作为解决这个问题的最佳方法.我调查过的一些事情:
>使用显式转换的void指针(这看起来好像很乱)
>只有所有数据结构都从中继承的虚函数的基类,看起来有点奇怪.
>对每个数据结构都有“友谊”的基类.
>为我们的问题集中的每个数据结构重写一个函数(我想象的是最糟糕的解决方案).
希望我忽略了一个常见的c工具,有没有人有任何想法?
最佳答案 事实上,将函数视为愚蠢的事实,将其视为不知道任何事情,并且必须将所有信息传递给它.
函数的参数:
>结构地址,作为uint8_t *. (需要打印字节)
>结构大小,以字节为单位. (需要打印字节并打印
总大小)
>成员信息的向量:成员长度或成员使用的字节总和.
需要向量来满足打印成员使用的字节和填充使用的字节的要求.您可以选择传递成员的总和.
例:
void Analyze_Structure(uint8_t const * p_structure,
size_t size_of_structure,
size_t size_occupied_by_members);
这个任务的技巧是弄清楚如何让调用函数确定这些项.
希望这可以帮助.
编辑1:
struct Apple
{
char a;
int weight;
double protein_per_gram;
};
int main(void)
{
Apple granny_smith;
Analyze_Structure((uint8_t *) &granny_smith,
sizeof(Apple),
sizeof(granny_smith.a)
+ sizeof(granny_smith.weight)
+ sizeof(granny_smith.protein_per_gram);
return 0;
}